博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jvm GC内存回收的思考
阅读量:5824 次
发布时间:2019-06-18

本文共 531 字,大约阅读时间需要 1 分钟。

hot3.png

问题描述

两系统间同步数据,因数据量较大,执行时间较长.数次执行后发现jvm占用内存较大,且长时间未释放. 排查代码,并未有全局引用.相关代码为局部变量,不存在引用未清空情况.

思路:

启动 visualVM 监控内存使用情况,模拟任务调度

  • 第一个红色框,为任务调度开始,此时因内存使用较大,Eden Sapce (新生代)触发多次gc,之后 Old Gen(老年代) 内存使用增大.推测,因为任务较大,中途触发多次新生代GC,导致list对象进入老年代.
  • 第二个红色框,再次触发GC后,新生代内存下降,老年代内未并未变化.新生代GC并未触发老年代GC,此时虽然对象已经没有引用,但是一直存在于老年代.
  • 第三个红色框,手动触发full GC,新生代,老年代同时GC,内存释放.

小结

jvm的GC,针对新生代,老年代调度是分离的,比如执行很多次新生代GC,但是老年代一直没有GC.full GC会导致虚拟机暂停,在内存充足的情况下没有必要full GC.属于正常情况,不需要调整代码.或者可以调整老年代大小,更加频繁的触发full GC,不过这肯定不是你想要的.

转载于:https://my.oschina.net/zhouxiang/blog/3056200

你可能感兴趣的文章
EntityFramework Core迁移时出现数据库已存在对象问题解决方案
查看>>
urb传输的代码分析【转】
查看>>
理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称
查看>>
一道算法题的一种O(n)解法
查看>>
ABP理论学习之NHibernate集成
查看>>
反射之动态创建对象
查看>>
隐马尔可夫模型学习小记——forward算法+viterbi算法+forward-backward算法(Baum-welch算法)...
查看>>
[MFC] CList
查看>>
[Android Pro] 完美Android Cursor使用例子(Android数据库操作)
查看>>
4 张 GIF 图帮助你理解二叉查找树
查看>>
c++中sizeof的分析
查看>>
线程间操作无效: 从不是创建控件的线程访问它的解决方法
查看>>
hdu 1236 排名
查看>>
【爆牙游记】黄山归来不看岳-日出。
查看>>
PHP面向对象深入研究之【继承】,减少代码重复
查看>>
RBAC权限管理
查看>>
此博客不再发表对自己私事的看法
查看>>
后台(20)——数据库连接池
查看>>
C# 开机自动启动程序
查看>>
导致Asp.Net站点重启的10个原因
查看>>