Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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中的垃圾收集是否发生在Java堆的perm区域?_Java_Garbage Collection_Jvm - Fatal编程技术网

Java中的垃圾收集是否发生在Java堆的perm区域?

Java中的垃圾收集是否发生在Java堆的perm区域?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我在读一篇文章,上面写着 堆的永久生成或堆的Perm区域有些特殊,它用于存储与JVM中的类和方法相关的元数据,它还托管JVM提供的字符串池,正如我的字符串教程中所讨论的,为什么字符串在Java中是不可变的。关于Java中的垃圾收集是否发生在Java堆的perm区域,有很多观点,据我所知,这是依赖于JVM的,至少在Sun的JVM实现中发生。您也可以通过创建数百万个字符串并观察垃圾回收或OutOfMemoryError来尝试这一点 所以我有一个问题: 垃圾收集是否发生在堆的Perm区域。如果不是,那

我在读一篇文章,上面写着

堆的永久生成或堆的Perm区域有些特殊,它用于存储与JVM中的类和方法相关的元数据,它还托管JVM提供的字符串池,正如我的字符串教程中所讨论的,为什么字符串在Java中是不可变的。关于Java中的垃圾收集是否发生在Java堆的perm区域,有很多观点,据我所知,这是依赖于JVM的,至少在Sun的JVM实现中发生。您也可以通过创建数百万个字符串并观察垃圾回收或OutOfMemoryError来尝试这一点

所以我有一个问题:


垃圾收集是否发生在堆的Perm区域。如果不是,那么静态变量或方法以及字符串文本池如何进行垃圾收集?

垃圾收集也发生在堆的permgen空间

静态变量在其各自的类加载器从内存卸载时被垃圾收集

字符串文字池可能永远不会被垃圾收集

编辑
如果permgen已满,则会发生
OutOfMemoryError:permgen

抓取集合确实发生在permgen中(基于Jvm实现)。我写了一个关于如何故意填充perm gen的问题的答案。JVM加载perm gen区域中的类等元数据。如果出于某种原因,JVM在permgen上运行不足,它可以决定卸载在任何地方都没有引用的类。但GC何时运行或是否运行可能会因JVM实现的不同而有所不同

卸载类以创建空间是jvm在抛出“内存不足:永久空间”之前的最后一搏


请看一看这个问题,这可能会很有帮助基本上这说明了如何通过防止permgen区域的GC来填充permgen。

首先
字符串文字池可能永远不会被垃圾收集。
所以如果它变满了,会发生什么情况。其次,请给出您的答案。@freshr-the“字符串文字池”不是内存中的“区域”,而是数据集合的概念分类。从理论上讲,插入字符串的“池”是可收集的。关于数据同步有一点复杂,加上“正常”情况下的大多数插入字符串都与加载的类相关联(大部分是不可收集的),因此JVM实际上可能会也可能不会尝试收集池。@hotlicks
字符串文字池不是“区域”"在内存中,but是数据集合的概念分类
。我以前听说过,但据我所知,它们在堆中占用内存。因为必须将分配给字符串引用的值存储在某个位置variable@Fresher-但池不是特定区域。字符串与任何其他对象一样占用堆空间堆的不同“区域”不是一成不变的——这取决于特定JVM使用的特定GC算法。但是,系统或默认类加载器加载的任何类(以及该类的静态)将永远不符合收集条件,因此可以安全地存放在“永久”中堆的一部分。由其他类加载器加载的类可能是可收集的。而且,根据您的摘录,我怀疑该作者是否知道他在说什么。@HotLicks您正在谈论的作者是Web上java的最佳作者之一,我很遗憾听到这个消息。那么您同意上面的作者吗?当谈到字符串时y随JVM的不同而不同。但所有JVM都在堆中分配一个逻辑区域,从permgen中加载的类中提取并保留所有字符串文本。这样做是为了只保留一个字符串文本副本。请参阅另一个so问题以进一步了解。@vkg-“logical”是最关键的词。没有“chunk”你可以指向并说“这是字符串池”的堆。一个插入的字符串是(除了表示它被插入的标志之外)与堆中的任何其他字符串都无法区分。@HotLicks我想我同意你的看法。但是现在无法编辑我的评论。我想说,请看我以前评论中的链接。那里的答案解释得很好。