Mar*_*ark 7 tomcat garbage-collection jvm
我是Java的新手,刚刚继承了Tomcat设置,所以我想要一些指导:)我在上周阅读了更多有关JVM调优和垃圾收集算法的内容,而不是我想要的!
使用Visual VM/GC,我们的Tomcat服务器每天运行一次完整的GC.鉴于大多数用户的网络会话持续时间不到一小时,这对于mee来说似乎很少见,并且可能很长时间内烫发器中存在很多"死"对象?那么这只是意味着我们有足够的RAM /堆空间,它根本不需要收集所以它不是吗?
考虑到这一点,由于促销率非常小,是否会让旧版本更小,新版本更大?
我问,因为在操作系统的其他地方有迹象表明我们可能有内存压力,但JVM/GC日志似乎与操作系统相矛盾.
与此相关 -
我们目前有min-heap=max-heap=6Gb.如果top显示java进程大小为7-8Gb,但RSS为5-6Gb,可能这意味着2Gb被换出?在这种情况下,当它充满GC时它就会死掉.因此,在操作系统交换之前,更频繁地使用更小的最小堆大小会更好.
通常最好让JVM调整自己,而不是手动设置所有参数,或者大多数人手动设置params?
小智 9
您使用的是哪个版本的Tomcat?
内存泄漏预防gubbins中存在一个错误,它会在一小时内导致完整的GC:
https://issues.apache.org/bugzilla/show_bug.cgi?id=53267
(注意bug在tomcat7上提到它,但是6也受影响,在6.0.36中修复)
垃圾收集是内存分配和性能之间的权衡.想象你的阁楼.如果你继续扔东西,最终它会变满,你将不得不把它清理干净.如果你有一个小阁楼,你可能每月填一次,但它只需要20分钟来整理.如果你有一个非常大的阁楼,可能需要一年的时间来填补,但周末要清理.
JVM也是如此.如果你分配6 GB,但你真的可以通过1.5 GB,那么你将有更少的垃圾收集,但当它们发生时,它可能会停止世界超过一分钟.
如果清除(从Eden复制到Survivor)正在恢复大部分内存,那么你有很多非常短暂的对象.如果增加新一代的大小,那么这些垃圾收集将变得不那么频繁,但是它们将花费更长的时间.理想情况下,您希望这些内容尽可能快,这意味着保持这个空间足够小以便可以快速扫描,但是足够大以至于短期对象不会被提升到终身代.我不会修改新一代的大小,除非我确信短期(即请求)对象在他们不应该的时候被终身.
如果它现在花了几天时间来填充6 GB,假设堆积累了来自每个用户会话的对象并且请求你自上次完整的GC之后就已经有了,我怀疑你正在释放一大块你的堆与完整的GC.如果你不是,那么你应该调查你是否有内存泄漏(可能是一个流氓缓存).如果使用完整的GC释放大部分堆,则应该调查较小的堆大小是否有意义.
较小的堆将增加完整垃圾收集的频率,但会使暂停显着缩短.在Web应用程序中,如果它们在高峰期发生,那么长时间停止全部垃圾收集的暂停是不可接受的.
如果,正如您所指出的那样,Java堆可能被操作系统交换,那么您肯定应该考虑缩小它.但我不会篡改新一代的尺寸.
根据我的经验,我认为这些陈述
“服务器每天进行的完整 GC 次数少于一次”
和
“操作系统其他地方有迹象表明我们可能存在内存压力”
是互相矛盾的。一般来说,GC 的频率会随着内存的变动而增加,而且这种情况发生的频率越低越好。
请记住,完整 GC 意味着所有应用程序活动都会停止 - 有时这可能需要几分钟,特别是对于大型堆!
例如,这里我有许多实时运行的系统,每个系统都有大约 1.4K HTTP 会话,每个框 ( )每小时-Xmx=13g执行大约 1-2 次完整 GC 。理想情况下,我们希望它的频率更低,但由于应用程序的性质,我们不能。
您需要澄清您要解决的真正问题是什么,因为从您提供的信息中我没有看到任何需要调整的内容。
| 归档时间: |
|
| 查看次数: |
11984 次 |
| 最近记录: |