我有一台运行 72 GB 内存的服务器,它使用具有并行 GC 的 Java 7 和 25G 的堆大小。但是在切换到 Java 8 之后,特定任务变得更慢。该任务基本上读取内存中大约 15GB 的文件,并更新数据库中的一些相关数据。完成这项工作通常需要大约一个小时,但在 Java 8 之后,它变成了 1.5 小时。
我试过:
- 将堆大小增加到 50GB => 无济于事
- 将 GC 算法从并行更改为 CMS,它变得更慢(1.8 小时)
所以我不确定从哪里开始看,运行任务的 java 库仍然是用 Java 7 编译的,但我不确定这是否相关? 切换到 Java 7 后,性能刚刚恢复。
最佳答案
要比较/发现 GC 问题,最好启用 GC 日志记录:
- -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:logs/gc.log
并使用 GCViewer 解析/可视化 GC 日志文件。如果您收集 GC 日志并将其附加到问题中,这将很有用。
在理论上(和实践),Java 8 比 Java 7 更快。您提到 Java 将数据写入 DB。可能值得分析两者的资源消耗,可能是数据库是根本原因。
关于java - 与 Java 7 相比,Java 8 中的 GC 明显变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783071/