【发布时间】:2020-06-20 04:45:14
【问题描述】:
我正在研究 JDK 7 JVM 的运行时数据区。
我想比较 JDK 7 JVM 和 JDK 8 JVM。 JDK 7 JVM中有一些内存区域,但我很困惑。
我在博客中寻找 JDK 7 JVM 运行时数据区架构图片和文章,但所有文章都说不同。
- 堆(包括年轻代、老代)
- 方法区(JVM中位于哪里?堆?非堆?本机内存?还是独立的?)
- 方法区中的运行时常量池
- 本机内存中的 JVM 堆栈
- 本机内存中的本机方法堆栈
- 本机内存中的 PC 寄存器
但我对 PermGen 在运行时数据区中的位置感到困惑。
有人告诉 PermGen 是方法区的一部分。
有人告诉 Method Area 是 PermGen 的一部分。
有人告诉 PermGen 是非堆的。 (那么 PermGen 位于 Native Memory 中?那么 Runtime Data Areas 分为 3 部分?(Heap, non-Heap(Method Area), Native Memory))
什么是正确的?
【问题讨论】:
-
我很好奇你为什么在乎?归根结底,它是从操作系统分配并通过 MMU 或某种类似机制映射的所有内存。人们选择给它起的名字并不重要。
-
如果您链接/引用了您在网上找到的相互矛盾的信息,也许它也会有所帮助。
-
最后,JVM 规范没有提及这些术语,而是让 JVM 实现或多或少地为所欲为。因此,如果您将这个问题的范围限制在特定的 JVM,比如热点等,也许最好。
-
“堆内存”和“非堆内存”在技术上没有区别。它是从同一个进程分配的同一种 RAM。有技术方面的问题,人们可能会认为这两种类型都是典型的,但是一旦这种分类不起作用,比如在“PermGen”案例中,讨论它属于哪个类别就没有意义了。讨论您感兴趣的特定技术方面会更有用。