JVM是什么??

Java Virtual Mechine

JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现

JDK将java程序编译成为class文件,JVM可以将class文件翻译成为不同平台的对应的不同识别

JVM的结构:

两个子系统:1Class Loader类加载系统  2Execution engine执行子系统

连个组件:1Runtime data area 运行时数据区域   2Native interface本地接口组件

Class loader 子系统的作用 :根据给定的全限定名类名(如 java.lang.Object)来装载 class 文件的
内容到 Runtime data area 中的 method area(方法区域)。Javsa 程序员可以 extends
java.lang.ClassLoader 类来写自 己的 Class loader。
Execution engine 子系统的作用 :执行 classes 中的指令。任何 JVM specification 实现(JDK)的核
’心是 Execution engine, 换句话说:Sun 的 JDK 和 IBM 的 JDK 好坏主要取决于他们各自实现的
Execution engine 的好坏。每个 运行中的线程都有一个 Execution engine 的实例
Native interface 组件 :与 native libraries 交互,是其它编程语言交 互的接口。
Runtime data area 组件:这个组件就是 JVM 中的内存。

重点是Runtime data area

由上图可以知道Runtime data area的结构:

    Heap  实例,数组,同一个java程序多个线程都共享一个堆空间。

    Method Area class信息。根据类型读取类型信息。

    Java Stack 两种操作:以帧为单位压栈出栈
每当线程调用一个方法的时 候,就对当前状态作为一个帧保存到 java stack 中(压栈);
当一个方法调用返 回时,从 java stack 弹出一个帧(出栈),栈大小有限制,
Program Counter 每个线程都有PC寄存器,指向下一条要执行的指令。 Native Method stack调用操作系统原生本地方法时,所需要的内存区域。不受JVM限制于控制 Runtime Constant Pool:运行常量池。:字符串,int -128到127范围的值 上面六个区域,处理PC register不会抛出OOM异常,其他都有可能oom

内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭

详细来讲就是:

本地方法栈(Native Method Stack):

与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,
而本地方法栈则为虚拟机使用到的Native方法服务。
程序计数器(Program Counter Register)

因为代码是在线程中运行的,线程有可能被挂起。即CPU一会执行线程A,线程A还没有执行完被挂起了,接着执行线程B,最后又来执行线程A了,
CPU得知道执行线程A的哪一部分指令,线程计数器会告诉CPU。
Heap
Java 程序在运行时创建的所有类实或数组都放在同一个堆中。而一个 Java 虚拟 实例中只存在一个堆空间,
因此所有线程都将共享这个堆。每一个 java 程序独 占一个 JVM 实例,因而每个 java 程序都有它自己的
堆空间,它们不会彼此干扰。 但是同一 java 程序的多个线程都共享着同一个堆空间

存放所有new出来的东西

Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。

在实现时,既可以实现成固定大小的,也可以在运行时动态地调整:-Xms256M -Xmx 1024M

在通常情况下,服务器在运行过程中,堆空间不断地扩容与回缩,会形成不必要的系统压力 所以在线上生产环境中

JVM的Xms和 Xmx会设置成同样大小,避免在GC 后调整堆大小时带来的额外压力。

Method area现在应该叫做Meta SPace
在 Java 虚拟机中,被装载的 class 的信息存储在 Method area 的内存中。当虚 拟机装载某个类型时,
它使用类装载器定位相应的 class 文件,然后读入这个 class 文件内容并把它传输到虚拟机中。紧接着
虚拟机提取其中的类型信息,并 将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。
与 Heap 一样,method area 是多线程共享的
Java stack 
以帧为单位保存线程的运行状态。虚拟机只会直接对 Java stack 执行两种操作:以帧为单位的压栈或出栈。
每当线程调用一个方法的时 候,就对当前状态作为一个帧保存到 java stack 中(压栈);当一个方法调用返回时,
从 java stack 弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能 出现 StackOverFlow 问题。

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、

动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。

在活动线程中, 只有位于栈顶的帧才是有效的, 称为当前栈帧。正在执行的方法称为当前方法。在执行引擎运行时, 所有指令都只能针对当前栈帧进行操作。
而StackOverflowError 表示请求的栈溢出, 导致内存耗尽, 通常出现在递归方法中。 虚拟机栈通过pop和push的方式,对每个方法对应的活动栈帧进行运算处理,方法正常执行结束,肯定会跳转到另一个栈帧上。在执行的过程中,如果出现了异常,
会进行异常回溯,返回地址通过异常处理表确定。

栈帧当中的:

局部变量表:
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,
在方法运行期间不会改变局部变量表的大小。

如果局部变量是Java的8种基本基本数据类型,则存在局部变量表中,如果是引用类型。

如new出来的String,局部变量表中存的是引用,而实例在堆中。

动态链接
每个栈帧中包含一个在常量池中对当前方法的引用, 目的是支持方法调用过程的动态连接。

java的内存布局,JVM 

按照线程是否私有划分 

垃圾分代回收算法(Generational Collecting) 

年轻代:JVM-Heap一部分

年老代:JVM-Heap一部分

持久代:JVM-Method area

Heap里面的分区情况:

 11Young generation space:
Young Genaration 新生区:更是又细为分 eden space,S0,S1 三个区。 Eden space 伊甸区:新创建的对象存储地方
Survivor 0 Space: 当Eden里面需要创建对象,但是空间已经用完了,JVM垃圾回收器将
对Eden进行垃圾回收。
1-不被其他对象所引用的对象进行销毁
2-存在被其他对象引用的对象移动到Survivor 0 Space。
存放新生区被垃圾回收新村下来的Java对象。
当Survivor 0 Space也没有空间存放的时候,JVM垃圾回收器将对此区进行垃圾回收
注意:如果该对象仅仅被一个没有其他对象引用的 对象引用的话,此对象也被归为没有存在的必要, Survivor 1 Space: 22Tenure generation space养老区:如果Survivor 1 Space也没有空间了就会垃圾回收,将存活的对象放到养老区。 当养老区,幸存者1,0区,伊甸区都没空间,JVM就会出现内存溢出OOM

下面去各个区域的JVM参数,可以启动通过-D注入设置

下面是自带的JVM监控工具,安装插件

Java VisualVM默认没有安装Visual GC插件,需要手动安装JDK的安装目录的bin目露下双击jvisualvm.exe,即可打开Java VisualVM,点击菜单栏 工具->插件 安装Visual GC就可以了

JVM-learning的更多相关文章

  1. 深入理解JVM虚拟机(二):JDK 内存类的异常分析

    JVM数据存储 堆存储(Heap):对象存储,实际上就是JAVA的数据存储 方法堆栈(Method Stack):存储方法调用的关系. 永久代(Perm):在JDK1.6及之前,常量数据存储于此区域 ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. (转)分布式深度学习系统构建 简介 Distributed Deep Learning

    HOME ABOUT CONTACT SUBSCRIBE VIA RSS   DEEP LEARNING FOR ENTERPRISE Distributed Deep Learning, Part ...

  4. Unsupervised Learning: Use Cases

    Unsupervised Learning: Use Cases Contents Visualization K-Means Clustering Transfer Learning K-Neare ...

  5. 17 Great Machine Learning Libraries

    17 Great Machine Learning Libraries 08 October 2013 After wonderful feedback on my previous post on ...

  6. JVM探索(二)

    java has four types of garbage collectors, Serial Garbage Collector Parallel Garbage Collector CMS G ...

  7. 读learning spark lighting chapter1~chapter2

    chapter 1 introduction to the analysis with spark the conponents of Sparks spark core(contains the b ...

  8. Deep Learning in R

    Introduction Deep learning is a recent trend in machine learning that models highly non-linear repre ...

  9. Machine Learning, Homework 9, Neural Nets

    Machine Learning, Homework 9, Neural NetsApril 15, 2019ContentsBoston Housing with a Single Layer an ...

  10. Machine Learning 资料

    Awesome系列 Awesome Machine Learning Awesome Deep Learning Awesome TensorFlow Awesome TensorFlow Imple ...

随机推荐

  1. 攻防世界Web_easytornado

    题目: 解题思路: 题目就三个txt文本文件 , 由python_template_injection这篇随笔中了解到tornado也是python web应用程序模板的一种,应该也是考查模板注入. ...

  2. Web渗透测试入门之SQL注入(上篇)

    题记: 本来今天想把白天刷的攻防世界Web进阶的做个总结,结果估计服务器抽疯环境老报错,然后想了下今天用到了SQL注入,文件上传等等,写写心得.相信很多朋友都一直想学好渗透,然后看到各种入门视频,入门 ...

  3. 2021年国内外五大BI厂商_商业智能工具推荐

    ​每家公司对于BI工具的使用都有自己的特点和期望,所以当面对国内外那么多的BI厂商时,大家可能会觉得难以选择.今天我将会为大家介绍国内外五大BI厂商,对于它们做出一些分析,让大家更了解这些BI厂商. ...

  4. Blazor和Vue对比学习:说在开始前

    1.Vue:现代前端三大框架之一(Vue/React/Angualr),基于HTML.CSS和JavaScript,2014年正式对外发布,目前已发展到3.X版本.值得说道的是,Vue的创始人作者是华 ...

  5. 【C# 线程】Windows系统下常见的7种I/O模型 之Overlapped I/O模型

    overview 这个字符到底是什么含义呢?其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠.  Overla ...

  6. HTML背景图加载过慢解决思路

    压缩图片的大小 第一个压缩图片网站 第二个压缩图片网站

  7. 2020ICPC南京 M.Monster Hunter

    题目大意 一颗根为 \(1\) 的有 \((2≤≤2000)\) 个节点的树,每个节点有一个权值 \(ℎ_{} (1≤ℎ_{}≤10^9)\) ,能删除某个点的前提是其父亲节点已经被删除,并且删除一个 ...

  8. 用RecyclerView实现水平滚动和网格视图

    建立RecyclerViewActivity.java文件 1 public class RecyclerViewActivity extends AppCompatActivity { 2 priv ...

  9. Python的内置数据结构

    Python内置数据结构一共有6类: 数字 字符串 列表 元组 字典 文件 一.数字 数字类型就没什么好说的了,大家自行理解 二.字符串 1.字符串的特性(重要): 序列化特性:字符串具有一个很重要的 ...

  10. SQL Server--频繁建立连接和断开连接

    使用数据库时,不建议一直与数据库保持连接,最好用时连接用完断开连接. 我的C#程序中采用"用时连接用完断开连接"的方式: 之前是C#程序调用本地数据库,没遇到问题: 后来改为C#程 ...