垃圾回收细节

2024-01-09 09:36:13

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

? ?

? ?

文章来源:https://blog.csdn.net/ma15732625261/article/details/134529014
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。