**段:存放在硬碟載入的**;
資料段:用來儲存靜態成員;
堆記憶體:存放物件和常量池;
常量池:存放常量。
關於常量池:不僅僅存放常量,也能存放一部分實現常量池的引用型別變數的值。除了浮點型別的包裝型別 integer long等和string型別都實現了,常量池,他們的一部資料可以儲存在常量池中。
1 除了浮點型別的包裝型別變數的值:
在【-128,127】這個區間裡,沒有new直接賦值的時候,值會儲存在常量池中,其他的會儲存在常量池之外的堆記憶體中;
public static void main(string args)
上面這段程式返回結果為true;因為integer實現了常量池,符合條件的值會儲存在常量池中,n1=1 會在常量池中查詢有沒有integer 1,有就把1的引用給n1,沒有直接建立乙個1.n2的值會被優化器優化為最終結果,再去記憶體查詢,發現存在了1,直接讓n2指向這個 1.因此n1和n2指向同一塊記憶體,兩個引用記憶體的值相等。
}這段**返回為false;n1>127,所以去常量池之外的棧記憶體建立了乙個物件,n2同樣建立了乙個物件。
2 string型別,類似於上面的包裝型別,沒有new直接賦值則保持在常量池,new過之後保持在其他堆記憶體中。不過,string沒有new但是出現了用變數連線值的情況,也會直接去常量池之外的堆記憶體建立物件。
public static void main(string args)
前兩個返回true,最後乙個返回false;
s1的值儲存在常量池中,s2的值經過優化器優化結果為"abc",然後去常量池查詢有「abc」嗎,結果找到了,直接指向「abc」,所以s1 s2指向同一塊記憶體。
s1的引用直接賦值給s3,所以s3和s1的值相同。
s4中出現了變數,優化器不會去優化,在程式執行時候,直接建立新物件,所以s4指向了其他地方。
最後一點就是:基本型別和引用型別儲存上最大的區別是 基本型別只佔一塊記憶體,引用型別佔兩塊記憶體。
JAVA記憶體相關基礎
jvm 記憶體劃分 暫存器 記憶體和 cpu 之間佔的記憶體 本地方法棧 jvm 呼叫了系統的功能 如 呼叫系統的複製貼上 方法 資料共享區 執行時 class 檔案進入的地方 方法棧 執行時所有方法進入的記憶體 堆 儲存的是容器 如 陣列 和物件 陣列建立過程 壓棧執行 好比上子彈,方法先進入方法...
基礎 Java記憶體和GC彙總
主要來自jvm 8 定義。執行時資料區生命週期一部分與jvm繫結,一部分與執行緒繫結 pc暫存器 與執行緒繫結。指向當前方法位址 非native 或未定義 native jvm棧 與執行緒繫結 堆 與jvm繫結。用來放new出來的例項 函式區與jvm繫結。用來儲存編譯後的中間 執行時常量池 與類繫結...
java基礎知識 棧記憶體和堆記憶體
1.person p new person 定義乙個物件,且使用new關鍵字在堆記憶體中開闢空間。宣告 person p null 在棧記憶體中宣告,只開闢了棧記憶體空間,物件無法使用。例項化物件 new person 在堆記憶體總開闢空間,方可使用。總結就是 1.物件是儲存在棧記憶體中,屬性儲存在...