jvm运行时数据区域可以分为:本地方法栈、虚拟机栈、堆、方法区、程序计数器(PC 寄存器)几个区域。其中,程序计数器、本地方法栈、虚拟机栈都是线程私有的。
本地方法栈
虚拟机栈
线程私有,声明周期和用户线程相同,为线程开启一块空间,线程之间互不影响。
每个方法执行的时候都会开辟一块空间被称为栈帧
一些基础类型基本上(并非绝对)都是存储存储在局部变量表
变量之间的一些运算会在操作数栈中完成,涉及到出栈和入栈的操作
是有个参数-Xss
可以设置虚拟机栈的大小,具体是否有作用,看虚拟机厂商的实现。
当虚拟机栈深度大于可申请的深度时,将会导致栈内存溢出的错误
java.lang.StackOverflowError
堆
这是整个jvm运行时数据区最大的一块区域,属于线程共享区域。
-Xms
-Xmx
可以设置堆内存大小
堆内存区域中有个Survivor区和eden区,Survivor区又分为s0区、s1区。年代区域
其中minor gc 会回收新生代区域的内存
新创建的对象会被放到eden区域,在触发minor gc 的时候会比较分代年龄,如果分代年龄大于15的时候会放入老年代,否则的话会选择进入s0还是s1,并且分代年龄加一
gc root 表示引用的根节点,每次gc的时候都从根节点开始
full gc 会清理堆和方法区。进行full gc的时候会发生stw(停止整个世界),短暂暂停用户线程
堆内存溢出的时候会发生:
java.lang.OutOfMemoryError: Java heap space
方法区(元数据区)
方法区存储类的元信息,静态变量,常量,字符串
程序计数器
线程私有,可以理解为程序执行到了哪行 。
持续更新中