Java中对象到底存在堆中还是栈中
创建一个对象的时候,到底是在栈中分配还是在堆中分配需要看2个方面:对象类型和在Java中存在的位置1.如果是基本数据类型,byte、short、int、long、float、double、char,如果是在方法中声明,则存储在栈中,其它情况都是在堆中(比方说类的成员变量就在堆中);2.除了基本数据类型之外的对象,JVM会在堆中创建对象,对象的引用存于虚拟机栈中的局部变量表中3.并不是所有的对象都在
·
创建一个对象的时候,到底是在栈中分配还是在堆中分配需要看2个方面:对象类型和在Java中存在的位置
- 如果是基本数据类型,byte、short、int、long、float、double、char,如果是在方法中声明,则存储在栈中,其它情况都是在堆中(比方说类的成员变量就在堆中);
- 除了基本数据类型之外的对象,JVM会在堆中创建对象,对象的引用存于虚拟机栈中的局部变量表中
- 并不是所有的对象都在堆中存储,可以走栈上分配,在不在栈上分配取决于Hotspot的一个优化技术:“逃逸分析”
逃逸分析中有方法逃逸和线程逃逸
- 方法逃逸:
就是当一个对象在方法中定义后,它可能被外部方法访问到,比如说通过参数传递到其它方法中 - 线程逃逸:
就是当一个对象在方法中定义后,它可能赋值给其它线程中访问的变量
如果不满足逃逸分析就会在栈上分配
栈上分配的好处就是方法出栈后内存就释放了,不需要通过gc来进行垃圾回收
需要注意的是:如果执行方法频次比较低的话,是不会触发栈上分配的
更多推荐
已为社区贡献2条内容
所有评论(0)