您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中內存區域與對象的概念和作用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中內存區域與對象的概念和作用”吧!
1、Java虛擬機包含以下幾個運行時數據區域:程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區。
2、程序計數器
1)在虛擬機的概念模型里,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等都需要依賴計數器來完成;
2)為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,因此是線程獨立的;
3)如果正在執行一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Native方法,,這個計數器的值則為空;
4)此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。
3、Java虛擬機棧
1)線程私有,生命周期與線程相同;
2)描述的是Java方法執行的內存模型:每個方法執行時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息,每個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程;
3)兩種異常:StackOverflowError和OutOfMemoryError。
4、本地方法棧
1)與虛擬機棧作用相似,區別是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧為虛擬機使用到的Native方法服務;
2)兩種異常:StackOverflowError和OutOfMemoryError。
5、Java堆
1)所有線程共享,存放對象實例和數組;
2)Java堆是垃圾收集器管理的主要區域;
3)Java堆可以處于物理上不連續的內存空間中,只要邏輯上連續即可;
4)如果沒有內存完成實例分配,并且堆也無法擴展時,將拋出OutOfMemoryError異常。
6、方法區
1)所有線程共享,存放被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據;
2)JDK1.8仍然保留方法區的概念,只不過實現方式不同,取消永久代,方法存放于元空間(Metaspace),元空間仍然與堆不相連,但與堆共享物理內存,邏輯上可認為在堆中;
3)無法滿足內存分配需求時,將拋出OutOfMemoryError異常。
7、使用new創建對象的過程
1)類加載檢查。首先檢查這個指令的參數是否能在常量池中定位到一個符號引用,并檢查這個符號引用代表的類是否已經被加載、解析和初始化,如果沒有,則必須執行類加載過程;
2)分配內存。兩種分配方式:指針碰撞和空閑列表。指針碰撞要求Java堆內存是絕對規整的,空閑列表允許Java堆不規整。采用那種方法取決于采用的垃圾收集器。
3)考慮并發問題。兩種方案:一種是CAS+失敗重試保證原子性,另一種是本地線程分配緩沖(TLAB),事先給每個線程分配一小塊內存,分配完了才需要同步鎖定。
4)初始化零值。保證對象的實例字段在Java代碼中不賦初值就可以直接使用。
5)設置對象信息。例如對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象頭中。
6)執行<init>方法。
8、對象的內存布局
1)3塊區域:對象頭、實例數據、對齊填充;
2)對象頭:包含兩部分信息,一部分用于存儲自身的運行時數據,如哈希碼、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向鎖線程ID、偏向時間戳等,另一部分是類型指針,指向它的類元數據的指針。
3)實例數據:是一個對象真正存儲的有效信息。
4)對齊填充:并不是必然存在的,由于HotpotVM的自動內存管理系統要求對象起始地址必須是8字節的整數倍,因此沒有對齊的部分需要通過填充來補全。
9、對象的訪問定位:主流的訪問方式有使用句柄和直接指針兩種,HotSpt采用的第二種方式訪問對象。
感謝各位的閱讀,以上就是“Java中內存區域與對象的概念和作用”的內容了,經過本文的學習后,相信大家對Java中內存區域與對象的概念和作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。