上篇介绍了关于jvm内存区域的概念性的内容
,本篇介绍对象访问在内存中的体现,及各内存模块常见异常
Object obj = new Object();
Object obj 这段申明语法体现在虚拟机栈中的局部变量表中,已reference存在。
new Object() 在堆中生成一块用于存储Object类型的内存块
不同虚拟机有不同的对象访问方式
1.句柄访问
jvm会在对中创建一个专门用于存放对象句柄的句柄池,栈中reference引用指向句柄池中句柄的对象,句柄对象保存真正的对象实例地址。
2.直接访问
直接访问是指栈中引用直接指向实例的地址。
句柄访问优点在于稳定,对象移动是只需修改句柄中的指针地址即可,无需修改栈中reference引用的地址
直接访问有点在于速度快,少了依次指针的定位,积少成多,效果还是很可观的。
常见异常
堆溢出:对象实例所需空间超过了堆得最大内存限制
java.lang.outOfMemoryError java heap space
栈异常:
1.strackOverFlowError
线程请求的栈深度大于虚拟机允许的栈的最大深度
2.outOfMemoryError
虚拟机在扩展栈时没有申请到足够的空间
方法区溢出:方法区用于存放类的相关信息,常量池,静态变量,访问修饰符,字段描述,方法描述等。
outOfMemoryError permGen space
出错场景:类越多,就需要越大的方法区存储对象类型数据(对象类型,父类,实现接口,方法等)
jvm内存配置相关参数
-Xms: 堆内存最小值
-Xmx: 堆内存最大值,当xms与xmx一致时表示堆不可扩展
-Xss: 栈的内存大小
-xx:permSize 方法区内存最小值
-xx:MaxPermsize 方法区内存最大值
-xx:MaxDirectMemorySize 直接内存 (不指定与Xmx一致)