【问题标题】:Where is permgen located in JDK 7 JVM? [closed]permgen 在 JDK 7 JVM 中的什么位置? [关闭]
【发布时间】:2020-06-20 04:45:14
【问题描述】:

我正在研究 JDK 7 JVM 的运行时数据区。

我想比较 JDK 7 JVMJDK 8 JVMJDK 7 JVM中有一些内存区域,但我很困惑。

我在博客中寻找 JDK 7 JVM 运行时数据区架构图片和文章,但所有文章都说不同。

  1. 堆(包括年轻代、老代)
  2. 方法区(JVM中位于哪里?堆?非堆?本机内存?还是独立的?)
  3. 方法区中的运行时常量池
  4. 本机内存中的 JVM 堆栈
  5. 本机内存中的本机方法堆栈
  6. 本机内存中的 PC 寄存器

但我对 PermGen 在运行时数据区中的位置感到困惑。

有人告诉 PermGen 是方法区的一部分

有人告诉 Method Area 是 PermGen 的一部分

有人告诉 PermGen 是非堆的。 (那么 PermGen 位于 Native Memory 中?那么 Runtime Data Areas 分为 3 部分?(Heap, non-Heap(Method Area), Native Memory))

某人的图片告诉 PermGen 是 Heap 的一部分

什么是正确的?

【问题讨论】:

  • 我很好奇你为什么在乎?归根结底,它是从操作系统分配并通过 MMU 或某种类似机制映射的所有内存。人们选择给它起的名字并不重要。
  • 如果您链接/引用了您在网上找到的相互矛盾的信息,也许它也会有所帮助。
  • 最后,JVM 规范没有提及这些术语,而是让 JVM 实现或多或少地为所欲为。因此,如果您将这个问题的范围限制在特定的 JVM,比如热点等,也许最好。
  • “堆内存”和“非堆内存”在技术上没有区别。它是从同一个进程分配的同一种 RAM。有技术方面的问题,人们可能会认为这两种类型都是典型的,但是一旦这种分类不起作用,比如在“PermGen”案例中,讨论它属于哪个类别就没有意义了。讨论您感兴趣的特定技术方面会更有用。

标签: java jvm permgen


【解决方案1】:

如果你只是简单的区分 Heap 和 Native 内存 PermGen 是 Heap 区域的一部分。方法区也是如此。

你附上的图在这方面基本是对的。

在 Hotspot-VM 中永久代 (PermGen) 是/曾经是 Heap 区域之一。

然而,它是一个与主内存堆分开的特殊堆空间。 它不受 -Xmx 或 -Xms 等 Java 选项的影响,并且有自己的限制和垃圾收集行为。因此,根据观点和上下文,也可以说它是非堆的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2015-08-30
    • 2023-04-05
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2017-05-10
    • 2013-05-25
    相关资源
    最近更新 更多