【问题标题】:Does the behaviour of the Java garbage collector evolve over time or get impacted by JIT?Java 垃圾收集器的行为是否会随着时间的推移而演变或受到 JIT 的影响?
【发布时间】:2014-01-25 08:05:27
【问题描述】:

我们的 Intranet 上运行了一个生产 Web 应用程序:

  • 每天 0300 重新启动,以便对其数据库执行备份
  • 在整个工作日(0800 到 1700)上都有相同的负载
  • 在 Java HotSpot(TM) 64 位服务器 VM 版本 20.45-b01 上运行
  • 在具有 16 个内核和 32 GB RAM 的物理机器上运行,运行 Linux 2.6.18-128.el5
  • 不与任何其他重要进程共享机器
  • 配置为:

    -Xms2g
    -XX:PermSize=256m
    -Xmx4g
    -XX:MaxPermSize=256m
    -Xss192k
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    -XX:+CMSParallelRemarkEnabled
    -XX:CMSInitiatingOccupancyFraction=50
    -XX:+DisableExplicitGC
    

每天的堆使用量:

  • 从启动到0800逐渐上升到90%
  • 在 0930 之前保持在 90%
  • 从 0930 到 1415 保持在 70%
  • 在 1415 下降到 50%
  • 在 1445 下降到 37%

此时堆在大约 40 分钟内上升到 55% 并被收集回 37%,直到下一次重新启动。

我们在 JVM 上安装了 AppDynamics,可以看到主要垃圾收集大约每分钟发生一次,对内存没有太大影响(当然上面概述的下降除外),直到内存达到 37%,此时主要收集变得不那么频繁了。

Web 应用程序的行为显然有数百个外部因素,但研究的一个途径是当 JVM 停止时 Hotspot JIT 信息明显丢失。

是否有 GC 优化/等也会随着 JVM 的关闭而丢失?由于某些热点优化尚未发生,JVM 是否有效地消耗了比它需要的更多的内存?

如果不重新启动 JVM 并且我们找到了另一种执行数据库备份的方法,我们是否有可能从此应用程序中获得更好的内存性能?

(重申一下,我知道有十万件事情会影响应用程序的行为,尤其是几乎没有人知道的应用程序!我真的只是想知道是否有某些事情与JVM的内存性能在停止时会丢失)

【问题讨论】:

  • 我对此一无所知,尽管我怀疑完全 JIT 优化仅在运行 6 小时后才会启动(0930 内存使用量最大,之后会下降)。对我来说,这看起来更像是一个最初过于懒惰的垃圾收集。如果你从 -Xmx3g 开始会发生什么?是不是内存不够了?
  • 我最有可能相信,在第一个小时左右之后,您看到的大部分波动都是由于工作量变化造成的。

标签: java garbage-collection jvm jit


【解决方案1】:

是的,由于 JIT 优化,GC 的行为可能会随着时间而改变。一个示例是自 Java 6u23 以来默认启用的“逃逸分析”。这种优化可以防止在堆中创建一些对象,因此根本不需要垃圾回收。

有关更多信息,请参阅Java 7's HotSpot Performance Enhancements

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多