强引用: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 转十六进制
? ?
? ?