JAVA 對象分配過程

來源:互聯網
上載者:User

標籤:

1. 在JAVA中,對象的分配一般使用new關鍵字。

  當虛擬機器遇到new指令時,會先檢查該指令所包含的參數在常量池中能否找到一個符號引用,並檢查該符號引用所代表的類是否被載入、解析和初始化。

  如果沒有,則會先執行類的載入過程。

2. 類載入完成後,會為該對象分配記憶體空間。一個對象需要多大的記憶體空間在類載入完成後就確定了。

 分配記憶體有兩種方法,依據記憶體空間是否規整來確定。

 如果被記憶體空間是規整的,只要把空閑指標向空閑記憶體方向挪動即可,這種方法稱為“指標碰撞”;

 如果記憶體空間不是規整的,需要有一個“空閑列表”用於記錄哪些記憶體是可用的,並從可用記憶體中分配足夠大小的記憶體出來,並修改“空閑列表”;

 在使用Serial、ParNew等演算法時是用的指標碰撞;使用Mark-Sweep等演算法時,採用空閑列表。

3. 在多線程環境下怎麼保證分配記憶體的動作是安全執行緒的。

 一種方法是對分配記憶體的動作進行同步;

 另一種方法是使用“本地線程分配緩衝(TLAB)”,每個線程會預先分配到一塊記憶體,申請記憶體會在各自的TLAB上進行;只有當TLAB不夠是,才需要同步分配新的TLAB;

4. 分配好記憶體後,虛擬機器會將除對象頭以外的空間初始化為0。這就是為什麼JAVA代碼中的全域變數可以不用初始化也可以使用的原因。

  此外,虛擬機器還會對對象頭進行必要的設定,比如對象所屬的類,對象的雜湊碼,對象的GC分代年齡等資訊。

5. 上述過程完成或,虛擬機器認為一個對象已經建立完畢,但是從程式來看,對象還沒有初始化,因此需要根據代碼初始化各個變數。

 這一步完成後,一個可用的對象就建立好了。

JAVA 對象分配過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.