为什么执行完GC后永久代分配的大小会增加?

7
以下是我在执行 jvisualvm 的执行GC后所拍摄的快照。 堆统计信息 以及 Permgen 统计信息 第一张图片是堆统计信息,第二张是 Permgen 统计信息。虽然 perm gen 大小不变,但当我执行 GC 后,使用的堆大小减少了(如预期),但分配给永久代的大小却增加了。这种行为可能有什么解释? JVM 参数使用:
-Xbootclasspath/p:../xyz.jar
-Xbootclasspath/a:../abc.jar
-Djava.endorsed.dirs=../resolver
-Djava.library.path=../framework
-Djavax.management.builder.initial=JBeanServerBuilder
-Djavax.net.ssl.trustStore=../certs
-Dorg.mortbay.log.class=JettyLogger
-Xms128m
-Xmx256m
-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=2000

注意:由于保密原因,我已更改名称(例如 xyz.jar)。

JVM 信息:

JVM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04, mixed mode)
Java: version 1.7.0_11, vendor Oracle Corporation
Java Home: /home/aniket/jdk1.7.0_11/jre
JVM Flags: <none>

4
我猜测垃圾回收机制在运行的时候会重新评估需要控制的各种大小。因此,它可能会认为持久代有一些不太够用,需要增加它的大小。 - Jens Schauder
你使用哪个虚拟机/垃圾回收器?你使用什么参数启动虚拟机? - Denis Tulskiy
1
@JensSchauder 给 Q 添加了 JVM 参数。 - Aniket Thakur
1
@DenisTulskiy添加了JVM信息和使用的参数。 - Aniket Thakur
你能否在采样器中提供“PermGen直方图”,这样我们就可以看到实际的变化了。 - maxammann
显示剩余3条评论
2个回答

3
  • 内存分配堆/Perm/Eden/Young/S1/S2等空间取决于用于GC的底层算法。
  • 上述空间的内存分配不是定义为绝对值参数。它们被定义为JVM可用的总堆/perm的比率。
  • 上述两点可能指出,当堆大小发生变化时,所有空间的所有内存分配都将重新评估以维护所定义的比率。

以下链接将非常有用:

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html


1

由于没有人提供答案,我将我的评论作为答案,尽管有点模糊:

我猜测GC会在收集运行的过程中重新评估它需要控制的各种大小。因此,它可能会决定在永久代方面有些紧张,从而增加其大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接