基本数据类型的成员变量存放在堆内存还是栈内存?_Android_编程问答

基本数据类型的成员变量存放在堆内存还是栈内存?

来源:互联网  时间:2018/1/26 2:19:47

关于网友提出的“ 基本数据类型的成员变量存放在堆内存还是栈内存?”问题疑问,本网通过在网上对“ 基本数据类型的成员变量存放在堆内存还是栈内存?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 基本数据类型的成员变量存放在堆内存还是栈内存?
描述:

下面这个类A里的int a,是存放在堆还是栈(Java虚拟机栈)内存?

public class A {

    int a = 0;

    B b = new B();
}

b是对象的引用肯定是存放在堆内存,那a呢?

看网上说a也是存放在堆内存,但看书上说:

Java虚拟机栈(VM Stack)的局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)

求解


解决方案1:

这里有比较清晰的说明 https://stackoverflow.com/a/6...

简单翻译下:

Heap space 堆空间: 所有存活的对象在此分配.
Stack space 栈空间: 方法调用时保存变量对象的引用或变量实例.
Perm space : 保存已加载的类的信息.

如:

Student std = new Student();
执行后内存情况如下:

Heap堆: 保存 "new Student()"
Stack栈: 保存实例变量信息 "std"
Perm Space: 保存类 Student 的信息.

这是一般性的描述, 具体实际上与JVM的实现及CPU平台相关. JDK里的实现通常是基于栈的, 即先将变量压入栈push,再invoke调用相应的方法. 但Android的Smali实际的Dalvik虚拟机为适应ARM处理,更多时用的是寄存器, 很多时调用是把方法的参数加载到各个寄存器,然后调用, 总之, 泛泛而言, java语言规范和jvm虚拟机规范是两码事, 你完成可以写一个不用堆或栈的虚拟机, 谁让你长得帅又这么有才呢 ;)

假设有下面一段代码:

public class Memory {

    public static void main(String[] args) { // Line 1
        int i=1; // Line 2
        Object obj = new Object(); // Line 3
        Memory mem = new Memory(); // Line 4
        mem.foo(obj); // Line 5
    } // Line 9

    private void foo(Object param) { // Line 6
        String str = param.toString(); //// Line 7
        System.out.println(str);
        System.out.println(str==str.intern());  // Line 8
    }

}

当程序运行到第5行(Line 5) 的内存情况如下图所示:

PS:
(Line 8),这行会输出true,意味着来自己于string pool?

关于局部变量是否放在字符串池的问题, 没有找到太直接的说法, 看上去不同的JVM版本有一些实现差导. 不过 @潘金莲的评论可能更接近于事实, 即局部变量(可能)不存在于字符串池, 希望看到的同学不要被这个图误导, 想了解更多,查更多资料才好!

解决方案2:

局部变量表是方法才用到的。a是实例变量。这两者没有联系的。

解决方案3:

堆内存,多个线程写操作这个对象的基本数据类型的成员变量会有线程安全问题.

解决方案4:

在java中只要是成员变量,一旦它所在类被实例化后,都是放在堆内存的,不管它是不是基础类型。局部变量才是放在栈内存的。所以java比其他语言内存安全的多。

上一篇Android View属性动画实现放大效果出现的问题!!
下一篇android Recyclerview 横向滑动怎么让item平均分布
明星图片
相关文章
《 基本数据类型的成员变量存放在堆内存还是栈内存?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)