Java垃圾收集器的行为是否会随着时间的推移而发生变化或受到JIT的影响?

时间:2014-01-07 15:07:52

标签: java garbage-collection jvm jit

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

  • 每天在0300重新启动,以便执行其数据库的备份
  • 在整个工作日(0800至1700)具有相同的负荷
  • 在Java HotSpot(TM)64位服务器VM版本20.45-b01
  • 上运行
  • 在具有16个内核和32个内存的物理计算机上运行,​​运行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%
  • 在09:30之前保持90%
  • 从0930年至1415年保持在70%
  • 在1415
  • 下降至50%
  • 在1445
  • 下降至37%

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

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

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

是否有关于JVM关闭的GC优化/等等? JVM是否实际上消耗了比它需要更多的内存,因为某些Hotspot优化还没有发生?

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

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

1 个答案:

答案 0 :(得分:0)

是的,由于JIT优化,GC的行为可能会随着时间的推移而发生变化。一个例子是'Escape Analysis',它自Java 6u23起默认启用。这种类型的优化可以防止在堆中创建一些对象,因此根本不需要垃圾收集。

有关详细信息,请参阅Java 7's HotSpot Performance Enhancements