淺析Java記憶體和建立物件時成員的初始化過程
記憶體的劃分:
1、暫存器: CPU在處理,儲存速度非常快,程式不可控制
2、本地方法區:和所在系統相關
3、方法區:
存放程式中所需類的位元組碼資訊和static定義的靜態成員4、棧記憶體:
儲存的都是區域性變數,棧中變數沒有預設初始化,變數所屬區域一旦結束,該變數就立即自動釋放(記憶體釋放),生命週期
都比較短,速度快。
棧中的資料可以共享(和堆中的常量池中的共享效果是一樣的)。
5、堆記憶體(堆記憶體中含有一個常量池):
存放動態產生的資料,比如是物件,凡是new建立的都在堆中。 沒有引用則視為垃圾,並不一定會立即釋放記憶體,java有垃圾
處理機制。
特點:1、每一個實體都有首地址值。
2、堆記憶體中的每一個變數都有預設初始化值,根據型別的不同而不同。char預設初始化'\u0000'
3、釋放方式是垃圾回收機制。
-->常量池:jvm為每一個已經載入的類維護一個常量池,常量池就是這個型別用到的常量的一個有序集合,包括直接常量和
對其他型別、方法、欄位的符號引用。此型別實現了常量池技術才可以在常量池中存放資料,八種基本資料型別中除去doubel
型別和float型別沒有實現常量池技術,其餘的全部實現,但是針對六種基本型別,常量池可提供其共享的範圍是[-128,127],
常量如果超過了這個範圍,就要在堆中建立物件,不進入常量池。
注意:1)、類的成員變數在不同物件中各不相同,都有自己的儲存空間(所屬物件)(成員變數在堆中的物件中)。而類的方法卻是該類的
所有物件共享的,只有一套,物件使用方法時方法才被壓入棧,方法不使用不佔用記憶體。
2)、引用資料型別儲存的是引用,例項是在堆記憶體中;基本資料型別存放的是資料值本身。Java中是“值傳遞”,只不過這個值可能是數
據值也可能是引用值。
當建立一個物件的時候,記憶體都做了什麼操作:
1、在程式進行編譯時期,是將程式程式碼編譯成位元組碼資訊
2、首先通過類裝載器載入類檔案的位元組碼資訊,經過解析後將其裝入方法區,類的各種資訊都在方法區中儲存著。
3、載入類資訊的時候,若所在類有靜態程式碼塊static{},則會隨著類的載入而被執行,在程式啟動到結束這個過程
中,類只被載入以此,靜態程式碼塊也只執行一次。(當存在繼承時,會先執行父類操作)
4、當使用關鍵字new建立一個類的例項時,jvm就會在堆記憶體中開闢一個空間。
5、建立物件時,物件的成員首先是進行預設初始化。
6、而後成員進行顯示初始化。
7,成員進行構造程式碼塊的初始化。
8,最後成員是建構函式的初始化。new的作用是建立物件,而建構函式的作用是初始化物件。