垃圾回收细节
强引用:all的GCRoot对象都不通过强引用引用该对象
堆中对象
引用计数法
被引用次数记录到对象头中,0次可回收
可达性分析
栈中引用的对象/方法区中类静态属性引用的对象/方法区常量引用的对象/本地方法栈引用的对象
算法:
标记清除:可达性分析标记垃圾,碎皮 内存不连贯
标记整理:gcroot标记垃圾,整理;
复制:划分两块内存区域,使用率低
分代回收:
堆:新生代:老年代1:2
minorGC 新生代垃圾回收,暂定时间短
mixedGC新生代+老年代部分区域,G1收集器持有
fullGC新生代+老年代完整垃圾回收,暂停时间长,避免用到
垃圾回收器:
串行:
堆内存小,个人电脑,单线程 stw
serial新生代复制算法;serial old老年代,标记整理算法
并行:jdk8默认
多个线程 stw
paraller new新生代复制,parallel old老年代标记整理算法
CMS并发 并发 标记-清除算法,老年代,最短回收停顿时间
G1:jdk9后默认
多个区域,humongous储存大对象,复制算法无内存碎片
新生代回收stw
并发标记:老年代占用内存超45%触发,不需要暂停用户进程
混合收集:重新标记阶段需要暂停用户线程,据暂停时间目标优先回收价值高的区域
调优工具
jps进程状态
jmap堆栈信息
jstack 进程内推栈信息
jstat:统计监测工具,垃圾回收/类加载/新生代统计信息
jconsole:可视化工具
内存泄漏:
虚拟机栈 stackoverflowerror ; 方法区元空间outofmemoryerror ; 堆 heap
jmap内存快照,启动命令行 - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
cpu飙高
top
ps H -eo pid,tid,%cpu | grep pid 线程
jstack pid 进程all线程
printf "%x\n" tid 转十六进制