首页 > 解决方案 > JVM内存的方法区有非静态区和静态区吗?

问题描述

听说某讲课JVM内存有非静态和静态区域,但是找不到JVM内存方法区这两个区域的信息。

方法区域中是否存在非静态和静态区域?

我认为它们一定是因为当程序需要一些非静态方法时,JVM必须将方法加载到方法区域的非静态区域,如果非静态方法不再使用,则必须有效地删除它堆区域或堆栈区域。

标签: javajvm

解决方案


我认为您可能将方法(代码)和字段(数据)的存储要求混为一谈。

非静态字段在每个具有这些字段的对象的堆节点中表示。自然,当对象被删除时,它的所有字段也会消失。

静态字段(通常)在与声明字段的类关联的堆节点中表示。通常,此节点在 JVM 的整个生命周期内都存在。但是,如果关联的类是unloaded,则该节点(理论上)有资格进行垃圾收集。

前一个节点和后一个节点是否在堆的同一区域是......实现相关的。

我怀疑这就是讲座所说的。(但是,如果没有实际看到/听到讲座材料所说的内容,则并不完全清楚。


JVM内存的方法区有非静态区和静态区吗?

基本上,没有。

保存方法代码的内存与类相关联,并且与类具有相同的生命周期1(见上文)。因此,静态和非静态(实例)方法的代码可以(并且是)以相同的方式存储。

存储代码的区域也取决于实现。但是,对于最近的 JVM,方法保存在元空间中……严格来说,这并不是 Java 堆的一部分。

最后一点:除非您是或计划成为 OpenJDK 开发人员,否则您不需要知道这方面的确切细节。如果您确实需要(或想要)了解确切的细节……请查看源代码。但请注意,您可能需要数周时间才能完全理解它,这取决于您对这类事情的经验。


1 - 这是一个过度简化。在某些情况下,JIT 编译器可能会重新编译本机代码。发生这种情况时,JVM 将重新分配保存方法的本机代码的内存块。然而,这一切都被照顾...


推荐阅读