Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PermGen波动率为99%,但与MaxPermSize相差甚远_Java_Garbage Collection_Jvm - Fatal编程技术网

Java PermGen波动率为99%,但与MaxPermSize相差甚远

Java PermGen波动率为99%,但与MaxPermSize相差甚远,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我遇到了一个可重复的情况,JVM正在承受沉重的GC负载。当我使用jmap-heap请求JVM统计数据时,我得到以下信息(这是来自linux上的Oracle JDK 1.7.025) 请注意,虽然它说MaxPermSize是256m,但它也说PermGen的容量为136MB,但容量为99.9% 这可以解释GC的混乱,但我的问题是为什么JVM不将PermGen扩展到完全可用的256m?是否有一些参数可以阻止池扩展的发生,并阻止JVM充分利用这256m 请注意,长期使用的泳池也变得有点紧,但远没有永久

我遇到了一个可重复的情况,JVM正在承受沉重的GC负载。当我使用
jmap-heap
请求JVM统计数据时,我得到以下信息(这是来自linux上的Oracle JDK 1.7.025)

请注意,虽然它说
MaxPermSize
是256m,但它也说PermGen的容量为136MB,但容量为99.9%

这可以解释GC的混乱,但我的问题是为什么JVM不将PermGen扩展到完全可用的256m?是否有一些参数可以阻止池扩展的发生,并阻止JVM充分利用这256m

请注意,长期使用的泳池也变得有点紧,但远没有永久性泳池那么紧

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio = 5
   MaxHeapFreeRatio = 10
   MaxHeapSize      = 805306368 (768.0MB)
   NewSize          = 1048576 (1.0MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 8
   SurvivorRatio    = 8
   PermSize         = 50331648 (48.0MB)
   MaxPermSize      = 268435456 (256.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 43909120 (41.875MB)
   used     = 495240 (0.47229766845703125MB)
   free     = 43413880 (41.40270233154297MB)
   1.1278750291511195% used
Eden Space:
   capacity = 39059456 (37.25MB)
   used     = 495240 (0.47229766845703125MB)
   free     = 38564216 (36.77770233154297MB)
   1.2679132039114933% used
From Space:
   capacity = 4849664 (4.625MB)
   used     = 0 (0.0MB)
   free     = 4849664 (4.625MB)
   0.0% used
To Space:
   capacity = 4849664 (4.625MB)
   used     = 0 (0.0MB)
   free     = 4849664 (4.625MB)
   0.0% used
tenured generation:
   capacity = 389492736 (371.44921875MB)
   used     = 350542912 (334.30377197265625MB)
   free     = 38949824 (37.14544677734375MB)
   89.99985868799361% used
Perm Generation:
   capacity = 143392768 (136.75MB)
   used     = 143338624 (136.6983642578125MB)
   free     = 54144 (0.0516357421875MB)
   99.96224077353747% used

174149 interned Strings occupying 19526656 bytes.

一个可能的原因是您的计算机没有更多的可用内存,因此JVM无法为PermGen分配更多的空间(您需要的可用内存比配置的内存多+30%)


另一个原因(我对此更感兴趣)是Java人体工程学的一种奇怪行为。可能是JVM决定PermGen的“最佳大小”为136MB,但在某个时候未能增加它。可能是因为你的永久基因导致内存泄漏。如果使用并发标记和扫描GC,您可以尝试使用
-XX:+cmsclasssunloadingerabled-XX:+cmsclasssweapingenabled

系统RAM总量是多少?它是32位还是64位jvm? 就主要问题而言(如上所述),JVM尝试分配PermGen空间(在定义的范围内),但在系统内存不可用时抛出OOM错误


但我不同意Alexey Ragozin的观点——如果MaxPermGen大小低于所需大小,那么JVM将停止并抛出Perm Gen空间错误——无论主机或堆的其他部分[Eden/Tentered]中有多少可用内存。

如果系统没有足够的内存来扩展堆大小(堆的任何部分),在热点JVM的情况下,它将导致JVM终止。标记扫描压缩算法没有过度扩展Perm空间的意义。JVM分配它真正需要的内存。没关系。我建议你描述一下真正的问题,我也有同样的问题。PermSize=20.75MB,MaxPermSize=256.0MB,但“PS Perm生成”几乎已满,容量为136.0MB,使用容量为130MB。有很多操作系统内存可用(>2GB)。我不明白。