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区,这种情况一定要特别关注。
元空间的前身是 Pern
区(Pern区,又叫永久代,在JDK8及以后的版本中已经被淘汰)。
Pern
区,又叫永久代,在启动时大小就已经确定,难以进行调优,
Metaspace
元空间,在本地内存中进行分配。并且 Pern
区中所有内容中 字符串常量
移至 堆内存
,其他的内容,包括 类元信息
, 字段
, 静态属性
, 方法
, 常量
等都移至 Metaspace
Original: https://www.cnblogs.com/hardyzhou/p/16618144.html
Author: hardyzhou
Title: Java 运行时数据区
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585140/
转载文章受原作者版权保护。转载请注明原作者出处!