内存与垃圾回收篇之(九)方法区
方法区 🔥🔥🔥
方法区使用的是本地内存(物理上的内存)
方法区在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中是实现了垃圾回收的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构