为什么我的JVM堆大小从2gig飙升到8 gigs?

bee*_*jay 4 java heap jvm glassfish

堆内存大小在2gig和~8gig之间大约每分钟一次(参见图片).

相关细节:

  • 高流量站点
  • 很多物理记忆
  • Redhat 5.5
  • Java 1.6.0_07
  • Glassfish 2.2.1(是的,我知道它已经老了.不,我们无法升级.是的,我知道使用它作为生产应用服务器是不寻常的).
  • -XX:MaxPermSize = 192m -XX:+ AggressiveHeap -Xms14336m -Xmx14336m

我对内存调整没有什么经验,但似乎MaxPermSize与Xms和Xmx完全不同.或者这是正常的吗?

jConsole堆thrashing

Ste*_*n C 14

为什么我的JVM堆大小从2gig飙升到8 gigs?

没有证据表明该系统正常(有害)意义上的颠簸.锯齿图案表示正在分配对象(上坡),然后GC回收它们.分配率似乎有点高,但有迹象表明GC正在高效运行.实际上,堆大小总是回落到〜2Gb的事实是一个好兆头,因为%CPU使用率很低.

我对内存调整没有什么经验,但似乎MaxPermSize与Xms和Xmx完全不同.或者这是正常的吗?

看起来很正常.

当然,没有必要增加permGen的大小.(PermGen用于预期永远不会被垃圾收集的对象;通常是实际的字符串1和代码段.正常的应用程序对象永远不会被分配或移动到permgen空间.)

假设,如果你没有大量的内存,高分配率可能会引起关注.但是,您无法通过调整GC参数来解决这个问题.您需要进行一些分析以查看创建这么多对象的内容,并了解尝试降低创建速率是否合理.根据应用程序的不同,尝试它甚至可能都不合理.


1 - 事实上,从Java 7实习生字符串开始,常规堆不是permgen.