Java 运行时数据区

Java 运行时数据区

  • 线程栈
  • 本地方法栈
  • 方法区
  • 程序计数器

image

我们的java文件,首先编译成class文件。通过类加载器加载到我们的Java虚拟机。Java虚拟机中,最大的一块是运行时数据区。

其中堆和方法区是所有线程共有的。线程栈、本地方法栈、程序计数器是每个线程单独拥有一份的。

类装载系统: 把class文件加载到Java虚拟机中
字节码执行引擎: 修改程序计数器
堆:存放对象
线程栈:存放线程私有的一些数据

    局部变量表: 存放局部变量
    操作数栈:存放需要的一些操作
    动态链接:把符号引用转换为真实的引用
    方法出口: 记录这个方法执行完成后的返回位置

本地方法栈:存放本地方法的一些数据

Heap 堆区

image
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

posted @   永和九年  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示