【读书笔记】深入理解Java虚拟机——垃圾收集

Ubuntu11.10下编译 OpenJDK7

http://blog.csdn.net/yhmhappy2006/article/details/7281710

基本垃圾收集算法

标记-清除(Mark-Sweep)

效率问题
内存碎片
适用于老年代

复制(Copying)

解决碎片问题
可用内存缩小(一半)
存活率高时,复制效率低
用于新生代

标记-整理(Mark-Compact)

适用于老年代
老年代存活率高,不适合复制算法

垃圾收集器

【读书笔记】深入理解Java虚拟机——垃圾收集_第1张图片

新生代垃圾收集器-基于复制

Serial

单线程(暂停用户线程)
复制
Client模式默认

ParNew

多线程并行(暂停用户线程)
复制
-XX:+UseParNewGC
默认开启CPU个数个线程(-XX:ParallelGCThreads)
Server模式下新生代首先(与CMS配合老年代)

Parallel Scavenge

多线程并行(暂停用户线程)
复制

“吞吐量优先”收集器,可精确控制吞吐量
吞吐量=用户代码时间/(用户代码时间+垃圾收集时间)

老年代垃圾收集器-基于标记-整理/清除

Serial Old

Serial的老年代版本
单线程(暂停用户线程)
标记-整理
主要在Client模式下使用
在Server下,作为CMS的后备,或与新生代PS收集器配合使用

Parallel Old

Parallel Scavenge老年代版
多线程并行(暂停用户线程)
标记-整理
From JDK1.6

CMS

适合互联网应用
并发
标记-清除(碎片!)
默认线程数:(CPU数量+3)/4
老年代使用了68%后触发(-XX:CMSInitiatingOccupancyFraction)

CMS步骤

初始标记
并发标记
重新标记
并发清除
其中两个“并发”步骤是不暂停用户线程的

内存分配回收策略

小对象在Eden区分配
大对象直接在老年代分配
(-XX:PretenureSizeThreshold)
长期存活的对象进入老年代
(-XX:MaxTenuringThreshold)
动态对象年龄判断
年龄为y的对象个数有n个,如果这n个对象的大小总和大于Survivor空间的一半,则年龄>=y的对象直接进入老年代,无需等到MaxTenuringThreshold
空间分配担保

相关工具

jmap

-heap

查看哪种收集器、分代情况(Linux)
-dump
生成堆快照
-dump:format=b,file=<filename>
-F
强制dump (Linux)
See
http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html

jstat

-class
监视类装载、卸载数量等
GC
-gc
-gcutil
JIT
……
See
http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

MAT

Java堆分析器,分析jmap –dump下来的数据,以图形界面形式展示分析结果

http://www.eclipse.org/mat/





你可能感兴趣的:(JAVA虚拟机)