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

每天在0300重新启动

  • ,以执行其数据库
  • 的备份
  • 在整个工作日(0800至1700)内具有相同的负荷
  • 在Java HotSpot(TM)64位服务器VM版本20.45-b01上运行
  • 运行在具有16个内核和32 gigs 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%
  • 保持在90%,直到0930
  • 从0930到1415年保持在70%的位置
  • 在1415年下降到50%
  • 在1445时降至37%

  • 这时,堆在大约40分钟内上升到55%,然后被无限次回收到37%,直到下一次重新启动为止。

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

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

    是否存在GC优化/etc,这些优化也随JVM的关闭而丢失了? JVM是否由于尚未进行某些Hotspot优化而有效地消耗了过多的内存?

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

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

    最佳答案

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

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

    关于java - Java垃圾收集器的行为会随着时间的推移而发展还是会受到JIT的影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20975043/

    10-11 18:29