与Java 7相比,Java 8中的GC明显变慢

Chi*_* Wu 6 java performance garbage-collection

我有一台运行72 GB内存的服务器,它使用带有并行GC的Java 7和25G的堆大小.但是在切换到Java 8之后,特定任务变得更慢.该任务基本上在内存中读取大约15GB的文件,并更新DB中的一些相关数据.完成这项工作通常需要大约一个小时,但在Java 8之后,它将变为1.5小时.

我试过了:

  1. 将堆大小增加到50GB =>没有帮助
  2. 将GC算法从并行更改为CMS,它变得更慢(1.8小时)

所以我不知道在哪里可以开始看看,运行任务的java库仍然是用Java 7编译的,但我不确定这是否相关?切换到Java 7之后,性能又回来了.

小智 2

要比较/查找 GC 问题,最好启用 GC 日志记录:

  • -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:logs/gc.log

并使用GCViewer解析/可视化GC日志文件。如果您收集 GC 日志并将其附加到问题中,这将很有用。

从理论上(和实践)来看,Java 8 比 Java 7 更快。您提到 Java 将数据写入 DB。可能值得分析两者的资源消耗,可能 DB 是根本原因。