JVM内存区域
1,程序计数器:当前线程执行的字节码的行号指示器,线程私有,唯一一个虚拟机规范中没有规定任何OOM的区域
2,虚拟机栈:用于存储局部变量,操作数栈,动态链接,方法出口信息等
3,本地方法栈:执行Native方法服务使用的的内存
4,堆:1个Eden区+2个survivor区+老年代,垃圾回收器管理的主要区域
5,方法区:存储类信息,常量,静态变量,也叫永久代
JVM常见参数
-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 新生代大小(一般为整个堆的1/3或1/4),其中包含1个Eden和2个Survivor
-XX:PermSize 初始永久代大小,永久代也就是方法区,多线程共享内存
-XX:MaxPermSize 永久代最大值
老年代大小 = 堆 - 新生代
JVM内存 = 堆 + 永久代
对象在JVM中如何分配
1,寻找空闲的堆空间,一种是指针碰撞,一种是空闲列表
在堆空间上分配该对象所需的空间,一种是CAS分配,一种是TLAB分配
2,初始化成员变量
3,引用指向对象
对象的访问定位
通过句柄访问对象
通过直接指针访问对象