JVM 垃圾回收性能分析
垃圾回收 JVM垃圾回收就是将JVM堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。
可达性分析算法 从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过得对象都是被使用的对象,而那些没有被标记的对象就是可以回收的垃圾对象。
回收的三种方法
清理 碎片区
压缩
负载
代码垃圾回收
Eden区中对象满了字后,会进行标记,将标记还在使用的对象拷贝到from区,重复这个过程当from区满了之后,将from 区和Eden区中标记的对象拷贝到To区,这时候前面两个区都为空了。
这个时候当Eden区中标记的对象满了后,Eden区中和To区的标记的对象会拷贝到From区。
这个时候当Eden区中标记的对象满了后,会将Eden区中和From区标记的对象拷贝到To区
来回几次后,生命周期比较长的对象不再来回拷贝,而是放到老年代中。
YOUNG GC
新生代
FULL GC
新生代
老年代
JVM垃圾回收器算法
串行回收器 单核cpu版本是单线程进行,其他线程都停止,回收完成后再运行,代价比较大。
并行回收器 多个串行回收器但是还是会终止用户线程。
并发回收器CMS
初始标记
并发标记
重标记
并发清理
有点 大部分时间和用线程是并发执行的,用户线程停止时间很小。
G1 垃圾回收器
-XX:MaxGCPauseMillis 期望GC最大暂停时间 参考值 会动态调整
java启动参数
标准参数
运行模式 -server,-client
类加载路径 -cp,-classpath
运行调试 -verbose
系统变量 -D
非标准参数
-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 新生代大小
-Xss 线程堆栈大小
非Stable参数 此类参数各个jvm实现会有所不同,将来可能会取消
-XX:-UseConcMarkSweeppGC启用CMS垃圾回收
JVM性能诊断工具
基本工具:JPS,JSTAT,JMAP,JSTACK
集成工具:JConsole,JVisualVM
JPS
-l 显示main class 的完整包
-v 显示相关参数设置
-q 显示pid
-m 输出传递给main 方法的参数
JSTAT
jdk轻量工具
资源实时监控
JMAP
输出所有内存中对象的工具,可以将VM中的heap,以二进制输出成文本。
使用
jmap -histo pid>a.log 一段时间后再生成一个进行比较。GC回收了哪些对象。
jmap -dump:format=b,file=f1 PID 将进程中的heap输出到f1文件夹。
jstack
查看线程堆栈信息
JConsole
JVisualVM
更漂亮
评论