java - 优化 Tomcat/垃圾收集

标签 java tomcat optimization garbage-collection performance

我们的服务器有 128GB 内存和 64 个内核,在 CentOS 6.3 上运行 Tomcat 7.0.30 和 Oracle jdk1.6.0_38。

我们每 60 分钟就会看到一次垃圾收集需要 45 - 60 秒。添加 -XX:-UseConcMarkSweepGC 将页面加载时间增加了大约 10%,但将其减少到大约 3 秒,这是一个可以接受的权衡。

我们的配置:

-Xms30g
-Xmx30g
-XX:PermSize=8g
-XX:MaxPermSize=8g
-Xss256k
-XX:-UseConcMarkSweepGC

我们将堆设置为 30 GB 以保持 32 位寻址(我读到超过 32 GB 时 64 位寻址会占用更多内存,因此您必须使用大约 48 GB 才能看到改进)。

使用 VisualGC,我可以看到 Eden 空间每 30 到 60 分钟循环一次,但 Survivor 0、Survivor 1、Old Gen 和 Perm Gen 的变化不大。

我们有一个强大的服务器。我们还可以进行哪些其他优化来进一步减少 3 秒 GC 时间?

有什么提高性能或扩展的建议吗?

任何其他有用的输出或配置信息?

最佳答案

这听起来可能违反直觉,但您是否尝试过分配更少的内存?例如。你真的需要 30G 堆吗?如果您可以使用 4G 或更少:垃圾收集可能会更频繁,但当它发生时它会快得多。通常我发现这比分配大量内存更可取,因为清理它需要时间。

即使这对您没有帮助,因为确实需要 30G 的内存,其他人也可能会遇到类似的问题,他们可能会从分配更少的内存中获益。

关于java - 优化 Tomcat/垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865931/

相关文章:

java - 超过 FileSizeMax 时取消文件上传

eclipse - 将eclipse tomcat项目移动到standalone tomcat

java - 像 JMeter 这样的程序可以测量 Java 套接字上每秒的事务数?

java - Android和Tomcat通信?

database - 优化 mySQL 中的嵌入式 SELECT 查询

mysql - 为什么 MySQL 不优化这个简单的查询并从缓存中提供结果?

java - 是否有一种无需缓存即可工作的 Java 脚本语言?吉通?时髦? ETC?

java - 使用 if-condition 还是 HashMap?

java - 将一年添加到 java.util.Calendar 时出现奇怪的结果

jakarta-ee - 在 Tomcat 6 中添加 java_opts 参数