JVM种类
JVM名称 | 公司 | 特性 |
---|---|---|
HotSpot VM | Oracle | J2SE标准JVM,由Oracle JRockit和Sun Hotspot合并而来 |
J9 VM | IBM | IBM自己的产品如Rational,Websphere运行时使用 |
Zing/Zulu | Azul system | 第三方JVM公司在Hotspot的基础上定制化优化而来,有自己的特性 |
JVM垃圾收集器种类(HotSpot)
JVM有多种可以配置选择的JVM垃圾收集器(回收jvm堆),通常是新生代+老年代的2种收集器的组合(有连线的才能组合,G1的整体收集器)
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
通过命令查看: java -XX:+PrintCommandLineFlags -version
中断收集: 垃圾回收时程序停止运行
Serial(单线程) – 复制算法
ParNew(多线程) – 复制算法
Serial Old(单线程老年代版)-- 标记-整理算法
ParallelOld(多线程老年代版)-- 标记-整理算法
Parallel Scavenge(多线程可调收集参数版)-- 复制算法
并发收集: 垃圾回收线程和程序可以同时运行,提高程序响应速度, 对CPU资源要求高,容易产生空间碎片,最终频繁触发老年代
CMS(多线程)-- 标记-清除算法
统一管理整个JVM堆: 统筹关联新老年代,并发收集,不容易产生碎片
G1 – 混合算法
参考文档: https://www.cnblogs.com/chenpt/p/9803298.html
https://blog.youkuaiyun.com/qq_26525215/article/details/84294481
JVM内存空间详解(1.8)
不共享空间:
- 程序计数器:记录每个线程当前执行的字节码指令地址(执行哪行代码),指导程序执行和线程切换时继续执行(执行native方法时为null(native方法是java调用外部语言执行的代码,比如c++))
- Java虚拟机栈:线程的对象引用,局部变量等,线程结束或者代码块结束后清空
- 本地方法栈: 给native方式使用的栈
共享空间(JVM):
4. 堆: 存放对象实例, 数组,字符串常量
共享空间(本地内存)
5. 元数据区: 虚拟机加载的类信息,静态变量,常量
6. 直接内存:native方法使用
参考文档:https://blog.youkuaiyun.com/bruce128/article/details/79357870
JVM垃圾回收算法
- 标记-清除算法:经可达性分析算法后,对没有引用的对象进行2次标记,如果2次都没有关联,则回收
- 复制算法:将内存分为大小相等的两块,一块用完后将需要继续使用的对象复制到另外一块,然后回收
- 标记-整理算法:标记存活对象后统一向一端整理,回收另一端的空间
- 分代收集算法(现有JVM常用算法,分为新生代-老年代)
参考文档:https://www.cnblogs.com/chenpt/p/9799095.html
https://www.cnblogs.com/chenpt/p/9797126.html