Java 运行时数据区
Java 运行时数据区
- 堆
- 线程栈
- 本地方法栈
- 方法区
- 程序计数器
我们的java文件,首先编译成class文件。通过类加载器加载到我们的Java虚拟机。Java虚拟机中,最大的一块是运行时数据区。
其中堆和方法区是所有线程共有的。线程栈、本地方法栈、程序计数器是每个线程单独拥有一份的。
类装载系统: 把class文件加载到Java虚拟机中
字节码执行引擎: 修改程序计数器
堆:存放对象
线程栈:存放线程私有的一些数据
局部变量表: 存放局部变量
操作数栈:存放需要的一些操作
动态链接:把符号引用转换为真实的引用
方法出口: 记录这个方法执行完成后的返回位置
本地方法栈:存放本地方法的一些数据
Heap 堆区
Heap堆区是发生OOM
故障最多的地方,堆中保存着我们创建的实例对象。堆是线程共享的。
堆的内存空间是可以自定义大小的,同时也支持运行时动态修改。通过-Xms
,-Xmx
者两个参数可以修改堆的初始值
和最大值
。-X
指的是JVM运行参数, ms
即memeory start的简称,代表最小堆容量
,mx
是memeory max的简称,代表的是最大堆容量
; 例如,-Xms256M:表示堆的初始值为256M,-Xmx1024M:表示堆的最大值是1024M
Heap
堆区主要分两个区,Young区和Old区,又称为新生代和老年代。
Young
区分为1个Eden
和2个Survivor
.
Old
区,当Young
区的对象满足一定的条件就可以放入Old
区。每个对象都有一个计数器,每当进行一次MiniGC,对象的年龄就会+1。当对象的的年龄到达指定的阈值,就会从Young
区移到Old
区。可以通过-XX:MAXTenuringThrehold
参数来指定,默认值是15。有些大对象也会直接被放入Old区,这种情况一定要特别关注。
Metaspace元空间
元空间的前身是Pern
区(Pern区,又叫永久代,在JDK8及以后的版本中已经被淘汰)。
Pern
区,又叫永久代,在启动时大小就已经确定,难以进行调优,
Metaspace
元空间,在本地内存中进行分配。并且Pern
区中所有内容中字符串常量
移至堆内存
,其他的内容,包括类元信息
,字段
,静态属性
, 方法
,常量
等都移至Metaspace
欢迎大家阅读,有问题和不足的地方欢迎大家指出。作者:永和九年,转载请注明原文链接:https://www.cnblogs.com/hardyzhou/p/16618144.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~