【发布时间】: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