jvm内存模型
jvm(java虚拟机)的内存模型分为五个:虚拟机栈,本地方法栈,方法区,程序计数器,堆。
虚拟机栈中存放Java方法,本地方法栈中存放native方法(一般为c++写的方法)
虚拟机栈
每当开启一个线程执行方法时,会在虚拟机栈中开辟一个栈空间,一个方法会开辟一个方法栈帧,每个栈帧中都会有局部变量表、操作数栈、动态连接、方法出口等等,重点说说这四个。
首先是局部变量表和操作数帧,比如以下代码:
int a = 0,b = 1, c = 2;
a = b + c;
虚拟机栈中的局部变量表中会存 a ,b,c。操作数栈会压栈 0,1,2。然后将操作数栈的值赋值给局部变量表的a,b,c;最后由计算出1+2=3,再把3赋值给a;
动态链接:类加载到方法区中,生成一个klass对象,klass中里面会有一个集合,存放方法对象的内存地址。动态链接中也会有一个方法对象的内存地址,动态链接中的地址指向klass的地址集合,从这个集合中找到所用的方法地址,压栈到动态链接中。
动态链接有两个实现思路:句柄池实现思路和直接方法实现思路
方法出口:即执行完一个方法后,记住从哪里继续执行。也叫恢复现场
堆
堆中分为新生代和老年代,新生代占比三分之一,老年代占比三分之二;
新生代中又分为Eden区(8/10)、from区(1/10)、to区(1/10)。
new一个对象的时候,这个对象的引用会先进入到Eden区,随着Eden区增多到满的时候发生minor gc,可用的对象会分配到from区,并标志年龄为1,不可用的直接gc掉。若Eden区又满了,对Eden区和from区gc,可用的分配到to区年龄+1。from区和to区来回切换,直到该对象年龄为15,分配到老年区。老年区满的时候发生full gc。内存较大的数据是直接分配到老年区,因为来回复制是十分消耗资源的。
jvm参数调节: -Xms 堆最小空间
-Xmx 堆最大空间
-Xmn 新生代堆的大小
-XX:maxtenuringThreshold 多少岁为老年