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

Java JVM和内存使用-JRun服务器未使用完整的PSPermGen分配?,java,memory,coldfusion,garbage-collection,jvm,Java,Memory,Coldfusion,Garbage Collection,Jvm,我试图理解为什么out ColdFusion 9(JRun)服务器抛出以下错误: java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space? JVM参数如下所示: -server -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC - 转储发生时,我让jconsole运行,我正在

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

java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
JVM参数如下所示:

-server -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC -
转储发生时,我让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)
我的第一个问题是转储显示了问题出在
PSPermGen
上-它说总数是77440K,但应该是196608K(基于我192m的JVM参数),对吗?我错过了什么?这是否与另一个非堆池(代码缓存)有关

我在32位机器上运行,Windows Server 2008标准。我想增加
PSPermGen
JVM参数,但我想了解为什么它似乎没有使用当前的分配

提前谢谢

“ChunkPool::allocate.Out of swap space”通常意味着JVM进程无法为其内部处理分配内存

这通常与堆使用情况没有直接关系,因为是JVM进程本身耗尽了内存。检查windows中JVM进程的大小。你可能已经达到了上限

这个bug报告也给出了解释。

这通常是由于应用程序没有释放本机的非java对象,而不是堆上的java对象

一些原因包括:

  • 线程堆栈大小过大,或者许多线程正在生成且未正确清理。线程堆栈位于本机“C”内存中,而不是java堆中。我自己也看过这个
  • Swing/AWT窗口以编程方式创建,不再使用时不显示。AWT背后的本机小部件也不存在于堆中
  • 未释放来自nio的直接缓冲区。直接缓冲区的数据分配给本机进程内存,而不是java堆
  • jni调用中的内存泄漏
  • 许多打开的文件未关闭
在诊断类似问题时,我发现这个博客很有帮助

当JVM请求操作系统提供更多内存时,会出现“交换空间不足”OOME,而操作系统无法满足该请求,因为所有交换(磁盘)空间都已分配。基本上,您已经达到了系统范围内可用虚拟内存量的硬限制

这可以通过应用程序或JVM的无故障来实现。或者,这可能是由于将
-Xmx
等增加到系统无法支持的程度

有三种方法可以解决这一问题:

  • 向系统添加更多物理内存

  • 增加系统上可用的交换空间量;e、 g.在Linux上,查看
    swapon
    和friends的手动输入。(但请注意,活动虚拟内存与物理内存的比率不要太大……否则,您的系统可能会“颠簸”,性能会下降。)

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


如果您陷入这种情况是因为您一直在增加
-Xmx
以应对其他OOME,那么现在是追踪(可能的)内存泄漏的好时机,这些泄漏是导致您的问题的根本原因。

检查您的setDomainEnv.cmd(.sh)文件。PermSize将有三种不同的条件
-XX:MaxPermSize=xxxm-XX:PermSize=xxxm。到处换

谢谢,它会读到所有这些。对于JVM PSPermGen参数和我的转储显示的PSPermGen内存量小得多,99%已满这一事实,有什么评论吗?为什么不全额分配呢?“C”内存正在使用吗?@Ciaran MaxPermSize只设置PSPermGen的上限,JVM可以自由分配更少的内存。PermGen几乎满是正常的,JVM很少允许有太多的空闲时间。如果对应用程序运行visual VM之类的工具,它将生成一个PermGen图,以便您可以看到堆是如何实时管理的我怀疑PermGen的完整限制没有被分配,因为您在应用程序需要192m PermGenAlso之前收到ChunkPool::allocate错误,当PermGen空间用完时,有一条特殊的错误消息:它是“java.lang.OutOfMemoryError:PermGen space”OK,所以看起来PermGen空间实际上可能不是我的问题,尽管它在我的转储中显示为99%已满?该死的。有人知道如何使用windows perfmon计数器测量“交换”空间吗?我已经用-XX:+HeapDumpOnOutOfMemoryError配置了JVM,我将使用Eclipse内存管理插件在下一次泄漏发生时找到泄漏的根源。同时,我现在可以考虑减少堆大小。我确实是内存泄漏!我在这里写下了我的经历,希望它能帮助其他人: