专栏首页我是攻城师Java基本类型的内存分配在栈还是堆

Java基本类型的内存分配在栈还是堆

我们都知道在Java里面new出来的对象都是在堆上分配空间存储的,但是针对基本类型却有所区别,基本类型可以分配在栈上,也可以分配在堆上,这是为什么?

在这之前,我们先看下Java的基本类型8种分别是:

byte =>8bit
short => 16bit
int => 32bit
long =>64bit

folat => 单精度32位
double => 双精度64位

boolean => 注意oracle官网文档介绍,boolean代表1bit的信息,但它本身的size却不是精确的,依赖于jvm和os的实现,比较常见的说法是,boolean单独使用的时候,在编译时是使用int代替的,如果是boobean数组,则是使用1byte代替

char => 16bit

注意字符串内部是用char数组实现的,所以属于引用类型。

基本类型在成员变量和局部(local)变量的时候其内存分配机制是不一样的。

如果是成员变量,那么不分基本类型和引用类型都是在java的堆内存里面分配空间,而局部变量的基本类型是在栈上分配的。栈属于线程私有的空间,局部变量的生命周期和作用域一般都很短,为了提高gc效率,所以没必要放在堆里面。

如下代码:

public class DemoTest {

    int y;// 分布在堆上
    public static void main(String[] args) {

        int x=1; //分配在栈上
        String name=new String("cat");//数据在堆上,name变量的指针在栈上
        String address="北京";//数据在常量池,属于堆空间,指针在栈
        Integer price=4;//包装类型同样是引用类型,编译时会自动装拆相,所以数据在堆上,指针在栈
    }


}

在java里面通过new出来的对象都在堆上分配,这里有两种特殊情况,

(1)字符串的字面量

字符串的字面量,没有new关键字,但却是在堆上分配内存的,严格的说是在堆里面的字符串常量池里面。

(2)基本类型的包装类

同样的道理,针对各个基本类型的包装类型,如:Integer,Double,Long等,这些属于引用类型,我们直接在局部方法里面使用包装类型赋值,那么数据真正的内存分配还是在堆内存里面,这里有个隐式的拆装箱来自动完成转换,数据的指针是在栈上,包装类型的出现主要是为了基本类型能够用在泛型的设计上和使用null值,而基本类型则拥有更好的计算性能,这一点我们也需要注意。

本文分享自微信公众号 - 我是攻城师(woshigcs)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊dubbo的CommandExecutor

    dubbo-2.7.2/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/Co...

    codecraft
  • 聊聊dubbo的DubboSwaggerService

    dubbo-2.7.2/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol...

    codecraft
  • 聊聊dubbo的ValidationFilter

    dubbo-2.7.2/dubbo-filter/dubbo-filter-validation/src/main/java/org/apache/dubbo/...

    codecraft
  • 聊聊dubbo的ClassLoaderFilter

    dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/Cl...

    codecraft
  • 聊聊dubbo的LogbackContainer

    dubbo-2.7.2/dubbo-container/dubbo-container-logback/src/main/java/org/apache/dub...

    codecraft
  • Java面试必问,深入理解 ThreadLocal 实现原理与内存泄露

    在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的.

    用户2781897
  • 聊聊sentinel的SentinelGatewayFilter

    Sentinel-1.6.2/sentinel-adapter/sentinel-spring-cloud-gateway-adapter/src/main/j...

    codecraft
  • JavaScript常用数组操作方法,包含ES6方法

    concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,仅会返回被连接数组的一个副本。

    李才哥
  • 被问到的一些面试题

    李才哥
  • 聊聊dubbo的SpringContainer

    dubbo-2.7.2/dubbo-container/dubbo-container-api/src/main/java/org/apache/dubbo/c...

    codecraft

扫码关注云+社区

领取腾讯云代金券