我们在Intranet上运行了一个生产Web应用程序:
每天在0300重新启动,以执行其数据库的备份
在整个工作日(0800至1700)有相同的负荷
正在Java HotSpot(TM)64位服务器VM版本20.45-b01上运行
正在运行Linux 2.6.18-128.el5的16核和32 GB RAM的物理机器上运行
不与任何其他重要过程共享机器
配置有:
-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信息明显丢失.
是否有关于JVM关闭的GC优化/等等?JVM是否实际上消耗了比它需要更多的内存,因为某些Hotspot优化还没有发生?
如果没有重新启动JVM并且我们找到了另一种执行数据库备份的方法,那么我们是否有可能从这个应用程序获得更好的内存性能?
(重申一下,我知道有十万件事可能影响应用程序的行为,尤其是一个几乎没有人知道的应用程序!我真的只想知道是否有某些与内存性能有关的事情.一个在停止时丢失的JVM)