在升级到运行JRE 1.6_17,CentOS 5 Linux的JBoss AS 5.1之后,JRE进程在大约8小时后耗尽内存(在32位系统上达到3G最大值).这种情况发生在中等负载下群集中的两台服务器上.Java堆使用率稳定下来,但整体JVM占用空间不断增长.线程数非常稳定,最大线程为370个线程,线程堆栈大小设置为128K.
JVM的占地面积达到3G,然后它死于:
java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space? Internal Error (allocation.cpp:117), pid=8443, tid=1667668880 Error: ChunkPool::allocate
当前的JVM内存args是:
-Xms1024m -Xmx1024m -XX:MaxPermSize = 256m -XX:ThreadStackSize = 128
鉴于这些设置,我预计流程足迹将在1.5G左右.相反,它只会持续增长,直到达到3G.
似乎没有一个标准的Java内存工具可以告诉我JVM本机端正在吃掉所有这些内存.(Eclipse MAT,jmap等).关于PID的Pmap只给了我一堆[anon]分配,这些分配并没有多大帮助.如果我没有加载JNI或java.nio类,就会出现此内存问题,据我所知.
如何解决JVM的本机/内部问题以找出所有非堆内存的位置?
谢谢!我正在快速耗尽想法,每8小时重新启动应用服务器不会是一个非常好的解决方案.