java - 我们如何提高低延迟系统的 GC 性能

标签 java tomcat garbage-collection

我们的java后端系统运行tomcat和jdk1.8,最大jvm大小为24g,系统延迟变长,cpu负载高,分析GC日志后发现GC停顿时间长,附上一些快照在 GCViewer 中。 我们如何提高 GC 性能?

Chart

Event Details

Memory

Pause

Summary

最佳答案

在不了解您的应用程序的情况下,这里有一些一般的想法:

  • 您的应用程序似乎有大量长期存在的对象(只有 9gb 的永久代被收集,剩下 15gb),这导致了您的问题:虽然分配速度决定了 GC 暂停的频率,但它是存活的数量对象(无法被 GC 释放)决定 GC 暂停的长度。
  • 一个可能的原因是您的应用程序在某种程度上充当内存数据库。也就是说,对象并非一直都需要,但不会写入数据库以保留对它们的快速内存访问。在这种情况下,您应该将它们存储在堆外(在不受 GC 管理的内存中)或使用内存数据库,例如雷迪斯。这样,它们将可以低延迟访问,但不会被 GC 考虑,因为它们无论如何都不会被回收。
  • 另一种可能的解决方案可能是调整您的 GC 设置:您可以切换到 G1,增加年轻代的大小或提高提升阈值;或这些的组合。增加年轻一代和减少晋升可能会导致终身一代的增长减少,从而减少主要收集的频率。切换到 G1 收集器会给您带来好处,因为该收集器只能考虑一些幸存者区域,并且可以单独留下具有不朽对象的区域。

关于java - 我们如何提高低延迟系统的 GC 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259975/

相关文章:

c# - 使用垃圾收集?

javascript - md5 值与语言相关吗?

java - 如何在 Xodus 中获取给定实体类型的属性类型?

java - Android应用程序文件类似于黑莓中的.cod和.jad文件

ruby-on-rails - JRuby/tomcat 响应 ajax GET 中的 404 错误

.net - 什么情况下GC.Collect()会清理对象?

silverlight - 为 Silverlight 行为自动调用 OnDetaching()

java - 如何在 OS X 中使用 Java 找到用户的 'Documents' 文件夹?

java - 两个应用程序运行在同一个 tomcat 上

java - JDBC 在生产服务器上不工作