在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java  Android/ 基本數(shù)據(jù)類(lèi)型的成員變量存放在堆內(nèi)存還是棧內(nèi)存?

基本數(shù)據(jù)類(lèi)型的成員變量存放在堆內(nèi)存還是棧內(nèi)存?

下面這個(gè)類(lèi)A里的int a,是存放在堆還是棧(Java虛擬機(jī)棧)內(nèi)存?

public class A {

    int a = 0;

    B b = new B();
}

b是對(duì)象的引用肯定是存放在堆內(nèi)存,那a呢?

看網(wǎng)上說(shuō)a也是存放在堆內(nèi)存,但看書(shū)上說(shuō):

Java虛擬機(jī)棧(VM Stack)的局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類(lèi)型(boolean、byte、char、short、int、float、long、double)

求解

回答
編輯回答
雅痞

在java中只要是成員變量,一旦它所在類(lèi)被實(shí)例化后,都是放在堆內(nèi)存的,不管它是不是基礎(chǔ)類(lèi)型。局部變量才是放在棧內(nèi)存的。所以java比其他語(yǔ)言?xún)?nèi)存安全的多。

2018年6月21日 03:31
編輯回答
懶洋洋

堆內(nèi)存,多個(gè)線程寫(xiě)操作這個(gè)對(duì)象的基本數(shù)據(jù)類(lèi)型的成員變量會(huì)有線程安全問(wèn)題.

2018年7月25日 01:59
編輯回答
久礙你

局部變量表是方法才用到的。a是實(shí)例變量。這兩者沒(méi)有聯(lián)系的。

2017年6月29日 10:46
編輯回答
冷溫柔

這里有比較清晰的說(shuō)明 https://stackoverflow.com/a/6...

簡(jiǎn)單翻譯下:

Heap space 堆空間: 所有存活的對(duì)象在此分配.
Stack space 棧空間: 方法調(diào)用時(shí)保存變量對(duì)象的引用或變量實(shí)例.
Perm space : 保存已加載的類(lèi)的信息.

如:

Student std = new Student();
執(zhí)行后內(nèi)存情況如下:

Heap堆: 保存 "new Student()"
Stack棧: 保存實(shí)例變量信息 "std"
Perm Space: 保存類(lèi) Student 的信息.

這是一般性的描述, 具體實(shí)際上與JVM的實(shí)現(xiàn)及CPU平臺(tái)相關(guān). JDK里的實(shí)現(xiàn)通常是基于棧的, 即先將變量壓入棧push,再invoke調(diào)用相應(yīng)的方法. 但Android的Smali實(shí)際的Dalvik虛擬機(jī)為適應(yīng)ARM處理,更多時(shí)用的是寄存器, 很多時(shí)調(diào)用是把方法的參數(shù)加載到各個(gè)寄存器,然后調(diào)用, 總之, 泛泛而言, java語(yǔ)言規(guī)范和jvm虛擬機(jī)規(guī)范是兩碼事, 你完成可以寫(xiě)一個(gè)不用堆或棧的虛擬機(jī), 誰(shuí)讓你長(zhǎng)得帥又這么有才呢 ;)

假設(shè)有下面一段代碼:

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
    }

}

當(dāng)程序運(yùn)行到第5行(Line 5) 的內(nèi)存情況如下圖所示:

圖片描述

PS:
(Line 8),這行會(huì)輸出true,意味著來(lái)自己于string pool?

關(guān)于局部變量是否放在字符串池的問(wèn)題, 沒(méi)有找到太直接的說(shuō)法, 看上去不同的JVM版本有一些實(shí)現(xiàn)差導(dǎo). 不過(guò) @潘金蓮的評(píng)論可能更接近于事實(shí), 即局部變量(可能)不存在于字符串池, 希望看到的同學(xué)不要被這個(gè)圖誤導(dǎo), 想了解更多,查更多資料才好!

2018年7月8日 06:33