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

浙公网安备 33010602011771号