为了账号安全,请及时绑定邮箱和手机立即绑定

java垃圾回收器不停的做GC,怎么回事?

java垃圾回收器不停的做GC,怎么回事?

陪伴而非守候 2019-03-23 18:19:56
最近写了个服务器小程序,开的线程比较多,大约在1000左右吧,高峰期会更多。今天忽然不停的GC,觉得很纳闷,不知道是怎么一回事,应该如何去做优化?GC日志如下:一次GC的时间间隔不到一秒,每次GC的时间也不到一秒。{Heap before GC invocations=306 (full 0):par new generation total 511936K, used 511872K [0x000000007fff0000, 0x000000009f3f0000, 0x000000009f3f0000)eden space 511872K, 100% used [0x000000007fff0000, 0x000000009f3d0000, 0x000000009f3d0000)from space 64K, 0% used [0x000000009f3d0000, 0x000000009f3d0000, 0x000000009f3e0000)to space 64K, 0% used [0x000000009f3e0000, 0x000000009f3e0000, 0x000000009f3f0000)concurrent mark-sweep generation total 5632000K, used 145047K [0x000000009f3f0000, 0x00000001f6ff0000, 0x00000001f6ff0000)concurrent-mark-sweep perm gen total 512000K, used 35276K [0x00000001f6ff0000, 0x00000002163f0000, 0x00000002163f0000)158889.595: [GC 158889.595: [ParNew: 511872K->0K(511936K), 0.0029090 secs] 656919K->145050K(6143936K), 0.0030557 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap after GC invocations=307 (full 0):JVM的配置参数如下:-Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=90 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
查看完整描述

4 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

这jvm参数是谁给的啊?
-XX:SurvivorRatio=65536,以为着survivor区非常小,小到几乎可以忽略了。你想象500M*1/65538能有多大啊。这参数默认是8,不知道楼主为什么要这么调。高并发可以调到6。调到65535,完全无法理解。

-XX:MaxTenuringThreshold=0,这个是新生代晋升到老年代的次数,0次,意味着只要活一次就到老年代了,omg,在高并发的时候可以不调,默认15次很好。不过调为0,真的很难理解,可以调到8试试。
这是两个大问题。

在高并发的时候-Xmn500M这个参数可以还大一点,比如1G或1.5G。


查看完整回答
反对 回复 2019-04-30
?
杨魅力

TA贡献1811条经验 获得超6个赞

让我等2G内存的编码小白,情何以堪。

最好吧功能代码也贴出来,上面只看出新生代


查看完整回答
反对 回复 2019-04-30
?
www说

TA贡献1775条经验 获得超8个赞

1楼说得很对,尤其是这个参数,-XX:MaxTenuringThreshold=0,它是指对象存活多少次再进入老年代的阈值,
设为0使得你大部分对象存活一次就要开始回收,这应该就是你频繁GC的主要原因了。设为默认的15左右可以自己实际测试下效果,但设为0肯定是不OK的。



查看完整回答
反对 回复 2019-04-30
?
呼唤远方

TA贡献1856条经验 获得超11个赞

看到这些JVM参数,是哪个调的啊?

我估计也根本就没理解甚至不知道JVM GC原理吧...


查看完整回答
反对 回复 2019-04-30
  • 4 回答
  • 0 关注
  • 1119 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号