jvm垃圾回收机制
1.垃圾分代回收
堆空间分为年轻代、老年代,默认内存占用比例为= 1:2对象分配步骤为:
1.1 年轻代
主要分为Eden、From、To三个区域,其中,默认内存占用比例为8:1:1存活对象进入年轻代的条件:新产生的对象优先分配到老年代(除大对象,大对象会优先分配到老年代)
1.2 老年代
存活对象进入老年代的条件:
1.2.1 创建大对象(对象内存大于设定阈值)直接进入老年代
1.2.2 young gc后,To Survivor区不足以存放存活对象
1.2.3 每次young gc后,存活对象年龄+1。经过多次young gc后,如果存活对象的年龄达到了设定阈值(默认15),则会晋升到老年代中。
1.2.4 动态年龄判定规则。
To Survivor区中年龄从小到大的对象占据空间的累加之和,占到了 To Survivor区一半以上的空间,那么大于等于此年龄的对象会直接进入老年代,而不需要达到默认的晋升年龄。举例:年龄1+年龄2+年龄3+年龄N的对象加起来的空间,大于survivor区域的一半,就会让年龄N和年龄N以上的对象进入老年代。动态年龄判断应该是这样子的。其中,年龄N是动态的,可能为3时达到此条件,也可能是是为15时,最大为15,对象头中年龄字段大小为4哥字节,故最大15。说的通俗一点:就是年龄从小到大对象的占据空间的累加和,而不是某一个特定年龄对象占据的空间。
2.垃圾回收触发时机
2.1 young gc
年轻代垃圾回收
2.1.1 Eden区可用内存不足
2.2 full gc 所有区域垃圾回收
2.2.1 老年代达到某一阈值(默认92%)
2.2.2 方法区可用内存不足
2.2.3 在young gc之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于会触发 Full GC;大于则会执行young gc(即使是不安全,有可能young gc后进入老年代的对象内存仍然大于老年代可用内存,此时会报内存溢出错误)
2.2.4 显式调用System.gc() 或者Runtime.gc()
197 声望
21 粉丝
推荐阅读
jvm堆内存和GC简介
年轻代分为生成区(Eden)和幸存区(Survivor),幸存区由FromSpace和Tospace两部分组成,默认情况下,内存大小比例:Eden:FromSpace:ToSpace 为 8:1:1。
蓝色瞳仁赞 2阅读 3.5k
jmap执行失败了,怎么获取heapdump?
但当我反复模拟OOM场景测试时,发现jmap有时可以dump成功,有时会报错,如下: 经过网上一顿搜索,发现两种原因可能导致这个问题,一是执行jmap用户与jvm进程用户不一致,二是/tmp/.java_pidXXX文件被删除,但经...
扣钉日记赞 2阅读 430
从原理聊JVM(一):染色标记和垃圾回收算法
属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
京东云开发者赞 3阅读 382
java获取到heapdump文件后,如何快速分析?
在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有触发OOM,但好在之前的复盘中总结了dump脚本,会在堆占用高时自动执行jstack与jmap,使得我们成功...
扣钉日记赞 2阅读 713
线上FullGC问题排查实践——手把手教你排查线上问题 | 京东云技术团队
观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决问题)。
京东云开发者赞 2阅读 319
全局视角看技术-Java多线程演进史
全文较长共6468字,语言通俗易懂,是一篇具有大纲性质的关于多线程的梳理,作者从历史演进的角度讲了多线程相关知识体系,让你知其然知其所以然。
京东云开发者赞 1阅读 585
一次线上OOM问题的个人复盘
上个月,我们一个java服务上线后,偶尔会发生内存OOM(Out Of Memory)问题,但由于OOM导致服务不响应请求,健康检查多次不通过,最后部署平台kill了java进程,这导致定位这次OOM问题也变得困难起来。
扣钉日记阅读 927
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。