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

标签 java performance garbage-collection

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

我试过:

  1. 将堆大小增加到 50GB => 无济于事
  2. 将 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/

相关文章:

java - 为 JCIFS 客户端添加 IPv6 支持

java - Orika - 没有为源定义具体的类映射

java - 如何从另一个类激活 loaddata()

ruby - 为什么 Ruby 的循环命令比 while true 慢?

java - GWT 垃圾收集

Java 8 lambda 弱引用

java - 如何使用 Apache POI 读取具有日期的 Excel 单元格?

java - Kotlin 无法获取所需的类型干扰 Array<Uri>!找到数组<Uri?>

performance - Azure 网站 Kudu HTMLLog 分析显示始终开启且响应时间较长

java - JVM 和内存使用 - JRun 服务器未使用完整的 PSPermGen 分配?