1. 程式人生 > >三、Java虛擬機器自動記憶體管理機制、物件建立及記憶體分配

三、Java虛擬機器自動記憶體管理機制、物件建立及記憶體分配

 

1、物件是如何建立:
步驟:
   (1)、虛擬機器遇到new <類名>的指令---->根據new的引數是否在常量池中定位一個類的符號引用
   (2)、檢測該符號引用代表的類是否已經被載入、解析、和初始化。(如果沒有則執行類載入過程)。
   (3)、在java堆中為新生物件分配記憶體。
   (4)、將分配的記憶體初始化為零值(不包括物件頭),保證了物件的例項欄位在java程式碼中可以不賦初始值就直接使用,
            程式所能訪問到的這些欄位的資料型別所對應的零值。
   (5)、呼叫物件<init>方法,按照開發者的意願進行初始化構造。



2、新生物件記憶體如何分配?
(1)、指標碰撞:
       java堆中的記憶體是絕對規整的,空閒的記憶體和用過的記憶體分別獨立開,中間利用一個指標作為分界點的指示器,
       分配記憶體就僅僅把那個分配的指標向空閒的那邊挪動一段與物件大小相等的距離。
(2)、空閒列表:
        當java堆中已經使用的記憶體和空閒的記憶體相互交錯時,虛擬機器維護一張列表,記錄上哪些記憶體塊是可用的,分配
        的時候從列表中找到一個合適足夠大的記憶體空間劃給物件例項,並更新表記錄。


 

3、物件建立的安全問題是什麼?
(1)、執行緒不安全,多執行緒操作指標引起的併發執行緒不安全。
(2)、java虛擬機器採用的是CAS配上失敗重試的方式保證更新操作的原子性。
(3)、把記憶體分配的動作按照執行緒劃分在不同的空間之中進行。