永久生成是堆的一部分,还是在JVM中位于其自身的不同空间中?

bvk5enib  于 2022-11-07  发布在  其他
关注(0)|答案(5)|浏览(155)

关于这个问题,我看到了很多评论--有些说是,有些说不是,很多答案都是模棱两可的。有人能用更简单的语言描述一下它的位置吗?在一个帖子中,我甚至看到有人说它和类内存共享相同的内存位置,类加载器将类加载到类内存中--这是真的吗?

up9lanfz

up9lanfz1#

原始(也许是错误的)答案:如果维基百科是可信的,它是堆的一部分。
编辑:我对此进行了更多的研究,包括OP在评论中引用的站点。(版本6),永久集合实际上在堆之外。也就是说,我不是JavaMaven,以前也不知道这个级别的内存管理细节,如果我的阅读是正确的,永久生成的放置(或甚至存在)是JVM实现细节。

myss37ts

myss37ts2#

从黑盒的Angular 来看,在Sun JVM中,永久生成不是jconsole 's documentation中所述的堆的一部分:
永久生成(非堆):包含虚拟机本身的所有反射数据(如类和方法对象)的池。对于使用类数据共享的Java VM,此生成被分为只读和读写区域。
实际上,这意味着在JVM进程中,-XX:MaxPermSize内存将等于-Xmx内存,因为堆中不包括永久生成。

ogq8wdun

ogq8wdun3#

下面是我对这个主题的理解:
永久生成堆中存储类定义的区域。如http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation所示,所有类示例都有一个对永久生成中其类型的类示例的“klass”引用。当在运行时创建新类型时,在永久生成中为其类型分配新空间。
Jon Masamitsu的博客文章中的图表显示了永久生成和堆中更频繁收集的部分之间的逻辑分离,其中可以存储程序的对象示例。永久生成仍然是堆的一部分。

c9x0cxw0

c9x0cxw04#

我在阅读Java Garbage Collection Basics时也遇到了同样的问题,在这篇文章中,作者认为永久生成是堆的一部分。
但我们两者都有:

  • -Xmx
  • -XX:最大允许大小

在谷歌上搜索这个问题后,我发现这个问题Java heap terminology: young, old and permanent generations?,答案得出结论:

永久生成不是堆的一部分

watbbzwu

watbbzwu5#

Permgen从Java 8中被删除。现在我们有了元空间,它不是堆的一部分,也不是内部内存的一部分。
此外,Java 8中的命令-Xmx -XX:MaxPermSize将被忽略
http://java.dzone.com/articles/java-8-permgen-metaspace

相关问题