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

-2 java jvm

听说在一个讲座中JVM内存有非静态区和静态区,但是找不到JVM内存的方法区这两个区的资料。

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

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

Ste*_*n C 5

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

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

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

前一个节点和后一个节点是否在堆的同一区域是……依赖于实现。

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


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

基本上,没有。

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

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

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


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