一、JVM的种类
-
Sun Classic VM
-
Exact VM(EMM 准确式)
-
HotSpot VM
-
JVM(Kilobyte)
-
JRockit
-
号称世界上最快的JVM
-
JIT即时编译
-
JVM处于世界一流水平
-
-
J9
-
Azui VM
-
Liquid VM
-
Dalvik VM
-
Microsoft VM
二、JVM的结构
-
类加载子系统
-
Java运行时数据区
-
执行引擎
-
本地方法接口
三、JVM运行时数据区
-
线程共享
-
方法区
-
堆
-
-
线程私有
-
虚拟机栈
-
本地方法栈
-
程序计数器
-
程序计数器(线程私有)
概念
一块较小的内存空间,当前线程所执行的字节码的行号指示器,包括分支、循环、跳转、异常处理、线程恢复等
特点
1.线程轮流切换CPU时间片后重新回到指令处理位置,故是线程私有的
2.唯一一个在Java虚拟机中不会出现OutOfMemeryError的区域
注:因为它只是当前线程执行的字节码的行号指示器
3.若线程执行的是Java方法,计数器记录的是正在执行的VM字节码指令地址,若执行的是Native方法,则计数器为空
4.与线程一起存在
虚拟机栈
先进后出
虚拟机栈:用户描述Java方法执行的内存模型
- 调整参数:-Xss<size>
栈帧:虚拟机栈中的栈元素(用于支持虚拟机进行方法调用和方法执行的数据结构)包括局部变量表、操作数栈、动态链接、方法出口
-
局部变量表:存放方法参数和方法内的局部变量
-
操作数栈:虚拟机的工作区(大多数指令都是从这里弹出数据,执行运算,然后把结果压会操作数栈)
-
动态连接:符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接
-
方法返回:程序正常完成出口和异常完成出口
方法区(线程共享)[非堆-Non-Heap]
image-20200702031716627.pngJDK1.8前后变化,JDK8取消了方法区,增加了元空间
1.主要存储:
-
类信息
-
常量
-
静态变量
-
即时编译器编译信息
2.数据过多会导致OutOfMemoryError异常
< JDK 1.8
- -XX:Permsize; -XX:MaxPermSize
>=JDK1.8
- -XX:MeteSpaceSize; -XX:MaxMateSpaceSize
和永久代的区别:
1.存储位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是连续的,而元空间属于本地内存;
2.存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中;
3.相当于永久代的数据被分到了堆和元空间中
直接内存:避免native空间和java堆中来回进行复制
- 通过设置-XX:MaxDirectMemorySize限制大小
堆(线程共享)
image-20200702033412543.png虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆
GC主要管理区域,可以通过-Xmx和Xms来设置最大和最小值,也可以通过-XX:NewSize -XX:MaxNewSize设置年轻代初始大小
超出空间大小会抛出OutOfMemoryError异常
新生区
新生区分为两个部分:伊甸区(Eden space)和幸存者区(survivor space)
伊甸区(Eden space)
大部分对象都会在Eden区诞生,并且一段时间不使用就会被GC回收
幸存者区(survivor space)
存在一段时间还在使用的对象会进入survivor区,survivor区包含一个相对的From区和to区,两者来回copy,回收没用的对象,用来延长对象的生命周期。
老年区(old FullGC)
经过多次GC仍然存在的对象会移动到老年区中,若老年区也满了,则会产生MajorGC(Full GC),对老年区进行内存清理(STW),若老年区执行了Full GC之后发现还是无法进行对象的报错,那么就会产生OOM异常”OutOfMemoryError“
虚拟机栈(线程私有)[VM Stack]
四、内存模型与回收策略
垃圾回收算法
1.标记-清除(Mark-Sweep)
问题:空间不连续,浪费空间
image-20200702035209179.png
复制(copying)
复制算法有2块一样大小的空间,情况对象时将可用的对象移动到to区里,复制算法内存空间连续
问题:要用2块空间,所以内存的模型from和to非常的小
image-20200702035446036.png标记整理
只用一块空间,先进行标记无用对象,然后整理内存空间地址,最后清除
image-20200702035633349.png五、垃圾收集器类型
串行搜集器(serial collector)
它只有一条GC线程,且就像前面说的,它在运行的时候需要暂停用户程序(stop the world)STW
并行搜集器(parallel collector)
它有多条GC线程,且它也需要暂停用户程序(stop the world)STW
并发搜集器(concurrent collector)
它有一条或多条GC线程,且它需要在部分阶段暂停用户程序(stop the world),部分阶段与用户程序并发执行
六、HotSpot中的垃圾收集器
串行搜集器的实现
serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)
并行收集器的实现
parNew(用于新生代,采用复制算法)、Parallel
Scavenge(用于新生代,采用复制算法)、Parallel
old(用于年老代,采用标记/整理算法)
并发搜集器的实现
concurrent mark sweep[CMS] (用于年老代,采用标记/清除算法)
网友评论