JVM调优-基础知识
JVM调优-基础知识
1.如何定位垃圾
- 引用计数:引用计数是如果一个对象有引用存在,计数器加一,如果计数为0,则认为是垃圾。这种方法有个问题,无法标记循环引用的一团垃圾。
- 可达性分析:从跟对象开始搜索,能够触达的对象不是垃圾。
那么什么是 根对象 (GCroot)
- 线程栈变量:main方法中的能访问的对象
- 静态变量:class静态变量初始化,能访问的对象
- 常量池
- JNI指针:native对象
2.清除垃圾的三个常用算法
- Mark-Sweep 标记清除
- Copying 拷贝
- Mark-Compact 标记压缩
三种算法的特点
- Mark-Sweep 标记清除 ,会产生碎片化内存空间
- Copying 拷贝,浪费一部分空间
- Mark-Compact 标记压缩,效率更低
3.堆内存的分代模型与对象空间分配过程
分代就是对象可以在新生代,或者老年代。这个分代即可以是逻辑分代,也可以是物理分代。
不同垃圾回收器,有不同的分代策略。
G1是逻辑分代,G1之前的都是逻辑+物理分代 ,ZGC ,Epsilon等等不分代。
新生代分为:Eden 和 from区,to区(copy算法)8:1:1
对象分配空间的过程
- 栈上分配
- TLAB本地分配
- 新生代到老年代
4.常用的垃圾回收器
几个常见分组
- Serial + Serial Old:最早的垃圾回收组合,单线程,适合小内存
- ParNew + CMS + Serial Old:CMS是里程碑,实现了并发清理
- Ps + Po:jdk8默认的回收组合,多线程
- G1:jdk9以后默认的垃圾回收,jdk8也可以使用,推荐。大内存使用
- ZGC:比较新,不了解。