专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

JVM老年代内存突然飚高_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/9 1:02:28       共计:3591 浏览

JVM老年代内存突然飚高?

能定位到是JVM老年代内存飙高,说明题主对JVM有了一定认识并且可能对JVM分代回收机制也有了解。

因为老年代内存存储对象是新生代中通过多次mingc都没有被释放掉的对象(或者age达到一定值或者新生代内存告急,导致频繁mingc,GC的同时引发majGC)

我就简单说一下在什么情况下可能产生老年代内存突然飙高以及其原因:

可能原因死循环中不断创建对象,导致Eden区内存爆满引起mingc,同时因为依然存在引用+新生代内存空间不足引起频繁mingc进而age快速增大然后被放入老年代中,使得老年代内存飙升。当然飙升一次最多也就是新生代的内存也就是1/3。载入大批量对象。这个大概率是从DB中获取数据时未限制返回条数或者返回条数设置失效导致一个查询导致内存暴增,引起连锁反应如上。业务逻辑新增众多静态引用对象或者类引用(这个往往是外行或者新手或者一些理论还不错的坑爹领导写的代码)。JVM分代内存大小比例设置和当前业务需求不匹配,可能项目业务需求已启动就需要50M内存空间而你只为新生代设置了60M内存空间。解决方式

通过linux top和jmap -histo:live [pid] 命令快速定位大内存代码块。不清楚的可以百度或者私信,手把手教会。

合理分配JVM堆内存分代比例。可以通过简单计算获取服务器启动所需内存,再通过一定比例设置。这个比例大致相同但是也可能根据项目特色发生比较大的变化。比如老年代:新生代=2:1,Eden:A:B=8:1:1。这些都是可以调整的。

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:一些外企很少有超过45岁的员工_java | ·下一条:加拿大是否有四大发明呢_java

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有