我目前运行的需要16GB的最大堆大小的应用程序。
目前我使用下面的选项来处理垃圾收集。
-XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX\:+DisableExplicitGC, -XX\:+PrintGCDateStamps, -XX\:+PrintGCDetails, -Xloggc\:/home/user/logs/gc.log
然而,我注意到,在一些垃圾收集,应用程序锁定了几秒钟,然后进行 - 这是完全不能接受的,因为它是一个游戏服务器。
从我的垃圾收集日志的使出,可以发现在这里 。
什么,我应该为了减少这些长暂停更改的任何意见,将不胜感激。
什么,我应该为了减少这些长暂停更改的任何意见,将不胜感激。
机会是在CMS GC无法与您的系统产生的垃圾量跟上。 但是,在GC必须执行的工作实际上是更密切相关,您的系统保持非垃圾量。
所以...
- 尽量减少你的应用程序的实际内存使用量; 例如,通过不缓存这么多的东西,或者减轻你的“世界”的大小。
- 尽量减少在您的应用程序产生的垃圾的速度。
- 升级到一台机器具有更多内核,以便有可在必要时运行并行GC线程更多的内核。
要Mysticial:
是在事后,这可能是更好地执行在C ++服务器。 但是,我们不知道“游戏”任何东西。 如果涉及到复杂的异构数据结构复杂的世界模型,然后用C实现它++ 可能意味着你替换服务器崩溃的所有时间的问题“GC暂停”的问题由于与方式的问题是管理其数据结构。
看你的日志,我看不出有任何长时间的停顿。 但年轻的GC是很频繁的。 促销率是很低的,但(最垃圾的年轻GC清除,因为它应该)。 在同一时间你的旧空间利用率低。
顺便说一句,我们在谈论的Minecraft服务器?
为了减少年轻GC的频率应该增加其大小。 我建议用启动-XX:NewSize=8G -XX:MaxNewSize=8G
对于这样大的年轻空间,你也应该减少生存空间大小-XX:SurvivorRatio=512
GC优化是试错的路径,所以你可能需要一些更多的迭代和调整。
你可以在博客亩夫妇找到有用的文章
- 热点JVM GC选项的cheatsheet
- 了解在热点JVM年轻GC暂停
我不是Java的垃圾回收方面的专家,但它看起来像你使用并发收集器(在UseConcMarkSweepGC标志)做正确的事,假设服务器有多个处理器。 按照故障排除的建议在http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms 。 如果你已经有了,让我们知道,当你尝试过什么事。
哪一个Java版本是您使用? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html为了更好地尽量减少在class.It使用实例变量的将是更好的局部变量比实例执行可变因素。它有助于程序,如果你正在使用的实例变量总是重置使用变量退出之前从同步problem.In操作结束时获得的性能和安全,并在需要时重新设置。 它可以帮助更多的在Java版本增强performance.Besides良好的垃圾回收政策implemented.It将是更好地移动到新的版本,如果是fleasible。 您还可以监视通过VisualVM的垃圾回收器的暂停时间,当它被执行更多垃圾回收,你可以得到更多的想法。