首页  >  问答  >  正文

java 基本数据类型各种情况下在内存中存储位置?

问题:

如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:

class demo {
    private int var1; // 字段1
    private Integer var2; // 字段2

    public static void main(String[] args) {
        int var3 = 0; // 变量1

        demo obj1 = new demo(); // 实例1
    }
}

我的理解

参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo

如果是存储在堆中的话,何来高效一说?

黄舟黄舟2743 天前544

全部回复(4)我来回复

  • PHPz

    PHPz2017-04-18 10:54:21

    我们不能一概而论的说,基本类型数据都是放在栈中的!当某个 类实例 中具有基本类型时,基本类型就放在堆中!

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:54:21

    内存分为堆和栈,这你已经知道了。

    堆内存是属于JVM的,栈内存是属于方法的,方法结束了,栈内存也就没了。

    程序运行main函数时,有一个堆内存,一个main的栈内存

    int var3 = 0;
    这个var3,是放在main函数的栈内存中的,是一个值。

    之后
    demo obj1 = new demo();
    main函数的栈内存中有了一个引用变量,obj1,指向了堆内存中new出来的这个实例。

    我们再看堆内存中的这个实例,他有2个字段,他们都是存放在堆中的。

    等到main函数运行结束时,假如还有别的线程在运行,JVM还没有结束,此时,main函数的栈内存被清除,var3,不在了,obj1这个引用变量也不在了,但是堆内存中的那个实例依然在,如果没有别的引用变量 指向它 ,那么它将在稍后被清除。

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

    是翻译错误,译文中用的是stack,即栈,而不是堆栈。以下是译文:

    特殊情况:原始类型

    您在编程中经常使用的一组类型会得到特殊对待。您可以将它们视为“原始”类型。进行特殊处理的原因是,用 new 创建对象(尤其是小而简单的变量)效率不高,因为 new 将对象放置在堆上。对于这些类型,Java 依赖于 C 和 C++ 所采用的方法。也就是说,不是使用 new 创建变量,而是创建一个不是引用的“自动”变量。变量直接保存值,并且放在上,所以效率更高

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

    p22,堆栈指的是stack,堆指的是heap

    回复
    0
  • 取消回复