内存与垃圾回收篇之(九)方法区

方法区 🔥🔥🔥

方法区使用的是本地内存(物理上的内存)

方法区在JDK 8以后就被称为元空间,元空间使用的就是本地内存(直接内存)

1. 栈、堆、方法区的交互关系

也叫栈、堆、方法区的配合关系

1.1 运行时数据区结构图

从线程共享与否的角度来看运行时数据区,可以作如下划分:

元空间除动态加载的类型信息外空间占用是比较稳定的,GC不会像堆空间一样频繁

拓展:

ThreadLocal用于解决如何保证多个线程在并发场景下的安全性

ThreadLocal典型的使用场景:数据库连接管理、线程会话管理

1.2 栈、堆、方法区的交互关系

Person:.class文件对应的运行时类本身是在方法区的

new Person();:new的对象放在堆空间中

person:对于局部变量来说,是存在在栈中的

2. 方法区的理解

官方文档

上述内容在官方文档中的位置:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4

JDK 8与以后的版本在运行时数据区基本没有变化,主要的变化体现在GC上

方法区的内存可以是不连续的。

方法区在哪里?

《Java虛拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的JVM实现可能不会选择去进行垃圾收集或者进行压缩。”但对 于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap (非堆),目的就是要和堆分开。
所以,方法区看作是一块独立于Java堆的内存空间。

方法区在逻辑上是属于堆的一部分,但在具体的JVM实现中是将方法区和堆分开的,堆和方法区是两个独立的结构。

方法区的基本理解

  • 方法区(Method Area) 与Java堆 - -样,是各个线程共享的内存区域。
  • 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区- -样都可以是不连续的。
  • 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误: java. lang . OutOfMemoryError: PermGen space 或者java. lang . OutOfMemoryError: Metaspace
  • 关闭JVM就会释放这个区域的内存。

3. 设置方法区大小与00M

4. 方法区的内部结构

5. 方法区使用举例

6. 方法区的演进细节

字符串常量池、静态变量在JDK 6、JDK 7、JDK 8中的演进

7. 方法区的垃圾回收

Java虚拟机规范中并没有强制要求所有的Java虚拟机实现必须要考虑垃圾回收,但在Hotspot中是实现了垃圾回收的。

8. 总结

posted @   刘二水  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示