JVM和内存使用 - JRun服务器没有使用完整的PSPermGen分配?

Cia*_*her 4 java memory coldfusion garbage-collection jvm

我试图理解为什么ColdFusion 9(JRun)服务器抛出以下错误:

java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
Run Code Online (Sandbox Code Playgroud)

JVM参数如下:

-server -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC -
Run Code Online (Sandbox Code Playgroud)

当转储发生时我运行了jconsole,我正在尝试使用-XX:MaxPermSize=192m上面的设置来协调一些数字.当JRun死亡时,它具有以下内存使用情况:

Heap
 PSYoungGen      total 136960K, used 60012K [0x5f180000, 0x67e30000, 0x68d00000)
  eden space 130624K, 45% used [0x5f180000,0x62c1b178,0x67110000)
  from space 6336K, 0% used [0x67800000,0x67800000,0x67e30000)
  to   space 6720K, 0% used [0x67110000,0x67110000,0x677a0000)
 PSOldGen        total 405696K, used 241824K [0x11500000, 0x2a130000, 0x5f180000)
  object space 405696K, 59% used [0x11500000,0x20128360,0x2a130000)
 PSPermGen       total 77440K, used 77070K [0x05500000, 0x0a0a0000, 0x11500000)
  object space 77440K, 99% used [0x05500000,0x0a043af0,0x0a0a0000)
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是转储显示PSPermGen存在问题 - 它表示总数为77440K,但它应该是196608K(基于我的192m JVM参数),对吧?我在这里错过了什么?这与其他非堆池 - 代码缓存有关吗?

我正在运行32位机器,Windows Server 2008 Standard.我正在考虑增加PSPermGenJVM参数,但我想理解为什么它似乎没有使用它的当前分配.

提前致谢!

Ste*_*n C 7

当JVM向操作系统请求更多内存时,OOME会发生"超出交换空间",并且操作系统无法满足请求,因为已经分配了所有交换(磁盘)空间.基本上,您已经达到了可用虚拟内存量的系统范围硬限制.

这可以通过应用程序或JVM的故障来实现.或者它可能是-Xmx超出系统支持能力的增加等的结果.

解决这个问题有三种方法:

  • 为系统添加更多物理内存.

  • 增加系统上可用的交换空间量; 例如在Linux上查看手册输入swapon和朋友.(但要小心,活动虚拟内存与物理内存的比例不会太大......或者你的系统容易"捶打",性能会下降.)

  • 减少系统上运行的进程的数量和大小.

如果你因为你一直在增加-Xmx与其他OOME的战斗而陷入这种情况,那么现在是追踪(可能的)内存泄漏的好时机,这是造成问题的根本原因.