JVM对象内存分配机制全解析
jvm创建对象的内存分配过程
1、逃逸对象在栈上分配
通过在栈上为对象分配内存,使对象占用的内存空间随着方法结束栈帧弹出而销毁,避免了GC垃圾收集器回收对象,减小GC的压力;
栈上分配内存依赖逃逸分析和标量替换。
逃逸分析:
- 分析对象的动态作用域
- 逃逸:当一个对象在方法中被定义后,可能被外部对象所引用,比如方法返回了该对象,则该对象的作用域范围不确定,可能存在被其他对象访问
- 没有逃逸:当对象在方法内使用,作用域仅在方法内部,比如实体对象入库完就结束了
标量替换:
- 通过逃逸分析确定对象不会被外部访问之后,会将对象在栈上创建,通过标量替换将对象进一步分解,将该对象的成员变量分解为方法的成员变量,在栈帧或者寄存器为这些代替的成员变量分配空间。
- 启标量替换参数:-XX:+EliminateAllocations,JDK7之后默认开启
- 标量与聚合量:标量不可被进一步分解的量,java的基本数据类型int、long以及reference类型是标量;聚合量是可分解的量,java的对象就是可被进一步分解的聚合量。