一、JVM内存模型
1、JVM虚拟机
1.1、虚拟机栈
存放局部变量
栈帧:
1.局部变量表:存放局部变量。
2.操作数栈:数据在计算过程中需要一块中转内存空间用来存放,就是操作数栈。
3.动态链接:在程序运行过程中,将符号引用变为直接地址引用。
4.方法出口:指向调用该方法的其它方法。例如A方法第三行调用B方法,那么B方法的方法出口指向A方法的第四行。
1.2、本地方法栈
运行native本地方法。调用c语言编写的代码。
1.3、堆
new一个对象就会放到堆中
1.4、方法区
常量,静态变量,类信息
1.5、程序计数器
存放当前线程运行到哪行代码的行号,为了是如果此时cpu去运行别的线程后再返回来的时候可以知道之前运行到哪里了,可以接着运行。
2、堆详解
2.1、年轻代-Eden区
新new的对象会先放入Eden区中。
2.2、年轻代-Survivor区
Survivor区中有两个相同大小的区域,为S0和S1区,当Eden区满了的话,会进行Minor Gc,将存活的对象放入到S0中,然后将Eden区中的垃圾对象全部清理,当Eden中又满了的话,会将Eden中存活的对象和S0中存活的对象一起放入S1中,依次类推。当存活次数达到15次,对象就会被放入到老年代中。
2.3、老年代
对象在年轻代存活15次后会被放入老年代中。当老年代放满了后会进行Full Gc。
二、STW
1、停止用户线程
1.1、停止用户线程
在进行Minor Gc或者Full Gc的时候会停止用户线程,用户会感觉到卡顿。Full Gc卡顿比Minor Gc更严重,所有我们要避免程序经常Full Gc。
三、方法区详解
1、方法区容量动态伸缩
1.1、默认初始
方法区默认初始值为21M,当方法区满了的话也会触发Full Gc,所以我们一般会手动设置方法区的容量,设置方法区的初始值和最大值命令: -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256
四、线程栈空间设置
1、线程栈空间设置
1.1、含义
线程栈是我们每一个线程中栈的总大小,默认为1M,可以通过命令修改:-Xss128k
结论:-Xss设置的越小一个线程的栈空间越少,但是能创建的线程数就会越多。