1.JVM垃圾回收机制
1.1 标记算法
- 引用计数法(进行对象引用计数)——缺点是无法进行解决循环引用
- 可达性分析——通过一个图,进行从root节点往下进行遍历,没有遍历到的就是无引用对象
1.2 回收算法
- 标记-清除法——分为标记,清除两个算法,先一层循环进行标记,再一层循环进行清除
- 复制算法——进行将内存分为两块,一块进行使用,使用完进行一次回收
- 标记整理——一轮循环标记,一轮进行交换位置,将不使用的放在末端,最后再全部回收(解决内存碎片化的问题)
- 分代收集算法——分为新生代,老年代,新生代有Eden, From Survivor, To Survivor区域,老年代有Tenured Gen区域
- Eden空间和Survivor空间的默认大小比例是8:1,可通过 -XX:SurvivorRatio 命令调整这个比例。
- 新生代和老年代默认内存大小的比例是1:2,可用过 -XX:NewRatio 命令调整这个比例。
- 经历一定Minor次数依然存活的对象,该次数可通过 -XX:MaxTenuringThreshold 命令调整,默认:15。
- Survivor空间中存放不下的对象,会存储在老年代。
- 新生成的大对象会存储在老年代中,可通过 -XX:+PretenuerSizeThreshold 命令调整。
- GC的分类
- Minor GC:从新生代回收内存。
- Full GC:回收整个Java堆空间的内存,包括新生代和老年代。Full GC比Minor GC慢很多,大概有10倍的差距,但是Full GC执行的频率比较低。
- Major GC:一般来说和Full GC是等价的,由于名词解读的混乱,当说Major GC时一定要问清楚是指Full GC还是仅指从老年代回收内存。
- 触发Full GC的条件:
- 老年代空间不足
- 永久代空间不足
- CMS GC时出现promotion failed,concurrent mode failure时
- Minor GC晋升到老年代的平均大小大于老年代的剩余空间
- 调用System.gc()
- 使用RMI来进行RPC或管理的JDK应用,没小时执行一次Full GC
1.3 垃圾回收器
- Serial(单线程——复制算法)
- ParNew(多线程——复制算法)
- Parallel Scavenge(多核多线程——复制算法)
- CMS(stop-the-world——标记清除)
- ParOld(多线程——标记清除)
- SerialOld(单线程——标记清除)
- G1(复制+标记清理,分为不等的region,年轻老年代不再物理隔离)
- jdk 1.8(Parallel Scanvenge(新生代)+Serial Old(老年代))
- jdk 1.9(G1)
1.4 查看回收器使用
- java -XX:+PrintCommandLineFlags -version
2. jstat使用
- jstat -class vmid 类加载统计
- jstat -compiler vmid 编译统计
- jstat -gc vmid GC查看
- jstat -gccapacity vmid 查看gc容量
- jstat -gcnew vmid 查看gc新生内存统计
- jstat -gcnewcapacity vmid 查看新生代容量
- jstat -gcold vmid 查看老年代内存统计
- jstat -gcoldcapacity vmid 查看老年代容量
- jstat -gcmetacapacity vmid 查看gc的元数据空间统计
- jstat -gcutil vmid 总结垃圾回收统计
- jstat -printcompilation vmid 编译方法统计
posted @
2021-01-13 22:49
SteveYu
阅读(
145)
评论()
编辑
收藏
举报