Java JVM和内存使用-JRun服务器未使用完整的PSPermGen分配?
我试图理解为什么out ColdFusion 9(JRun)服务器抛出以下错误: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运行,我正在
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调用中的内存泄漏
- 许多打开的文件未关闭
-Xmx
等增加到系统无法支持的程度
有三种方法可以解决这一问题:
- 向系统添加更多物理内存
- 增加系统上可用的交换空间量;e、 g.在Linux上,查看
和friends的手动输入。(但请注意,活动虚拟内存与物理内存的比率不要太大……否则,您的系统可能会“颠簸”,性能会下降。)swapon
- 减少系统上运行的进程的数量和大小
如果您陷入这种情况是因为您一直在增加
-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内存管理插件在下一次泄漏发生时找到泄漏的根源。同时,我现在可以考虑减少堆大小。我确实是内存泄漏!我在这里写下了我的经历,希望它能帮助其他人: