我们都知道在Java里面new出来的对象都是在堆上分配空间存储的,但是针对基本类型却有所区别,基本类型可以分配在栈上,也可以分配在堆上,这是为什么?
在这之前,我们先看下Java的基本类型8种分别是:
注意字符串内部是用char数组实现的,所以属于引用类型。
基本类型在成员变量和局部(local)变量的时候其内存分配机制是不一样的。
如果是成员变量,那么不分基本类型和引用类型都是在java的堆内存里面分配空间,而局部变量的基本类型是在栈上分配的。栈属于线程私有的空间,局部变量的生命周期和作用域一般都很短,为了提高gc效率,所以没必要放在堆里面。
如下代码:
在java里面通过new出来的对象都在堆上分配,这里有两种特殊情况,
(1)字符串的字面量
字符串的字面量,没有new关键字,但却是在堆上分配内存的,严格的说是在堆里面的字符串常量池里面。
(2)基本类型的包装类
同样的道理,针对各个基本类型的包装类型,如:Integer,Double,Long等,这些属于引用类型,我们直接在局部方法里面使用包装类型赋值,那么数据真正的内存分配还是在堆内存里面,这里有个隐式的拆装箱来自动完成转换,数据的指针是在栈上,包装类型的出现主要是为了基本类型能够用在泛型的设计上和使用null值,而基本类型则拥有更好的计算性能,这一点我们也需要注意。
历史文章:
什么是缓存置换算法?
复盘一个Elasticsearch排序问题的剖析
什么是操作系统的虚拟内存?
Java反射从放弃到入门
原文 http://mp.weixin.qq.com/s?__biz=MzAxMzE4MDI0NQ==&mid=2650336696&idx=1&sn=e34dea7b8fdac6d0f6f1627ea3eecb83