java - JVM内存的方法区有非静态区和静态区吗?
问题描述
听说某讲课JVM内存有非静态和静态区域,但是找不到JVM内存方法区这两个区域的信息。
方法区域中是否存在非静态和静态区域?
我认为它们一定是因为当程序需要一些非静态方法时,JVM必须将方法加载到方法区域的非静态区域,如果非静态方法不再使用,则必须有效地删除它堆区域或堆栈区域。
解决方案
我认为您可能将方法(代码)和字段(数据)的存储要求混为一谈。
非静态字段在每个具有这些字段的对象的堆节点中表示。自然,当对象被删除时,它的所有字段也会消失。
静态字段(通常)在与声明字段的类关联的堆节点中表示。通常,此节点在 JVM 的整个生命周期内都存在。但是,如果关联的类是unloaded,则该节点(理论上)有资格进行垃圾收集。
前一个节点和后一个节点是否在堆的同一区域是......实现相关的。
我怀疑这就是讲座所说的。(但是,如果没有实际看到/听到讲座材料所说的内容,则并不完全清楚。
JVM内存的方法区有非静态区和静态区吗?
基本上,没有。
保存方法代码的内存与类相关联,并且与类具有相同的生命周期1(见上文)。因此,静态和非静态(实例)方法的代码可以(并且是)以相同的方式存储。
存储代码的区域也取决于实现。但是,对于最近的 JVM,方法保存在元空间中……严格来说,这并不是 Java 堆的一部分。
最后一点:除非您是或计划成为 OpenJDK 开发人员,否则您不需要知道这方面的确切细节。如果您确实需要(或想要)了解确切的细节……请查看源代码。但请注意,您可能需要数周时间才能完全理解它,这取决于您对这类事情的经验。
1 - 这是一个过度简化。在某些情况下,JIT 编译器可能会重新编译本机代码。发生这种情况时,JVM 将重新分配保存方法的本机代码的内存块。然而,这一切都被照顾...
推荐阅读
- reactjs - 如何在 ReactStrap 中使用 innerRef ?#TypeError:无法读取未定义的属性“用户名”
- c# - 为什么避免在测试类中引入共享状态是不好的?
- javascript - 从 selenium 中的 JavaScriptExecutor 中选择日历日期
- sql - 用其他表中的值替换选择值
- mobile-application - 通知用户有移动应用程序的原生方式?
- r - 获取具有两个变量和多个行名的 p 值
- algorithm - 非随机访问结构中二进制搜索的复杂性
- python - 修改包含 nan 的 pandas 列的值
- php - php文件被识别但没有输入
- swift - 两个 ios 设备之间的后台扫描和广告