Java內存區域以及對象創建

概述

對於Java程序員來說,在虛擬機自動內存管理機制的幫助下,不再需要爲每一個new操作去寫配對的delete/free代碼,不容易出現內存泄漏問題。不過由於虛擬機的內存控制權限過大,導致程序員對內存錯誤的排除變得異常艱難,因此瞭解Java虛擬機對內存的使用方式變得非常重要。

運行時數據區域

Java虛擬機再運行時將內存劃分爲若干個不同的數據區域。這些區域各有用途以及創建和銷燬時間,有的區域隨虛擬機進程的啓動而存在,有的區域則以來用戶線程的啓動、結束而建立和銷燬。

  1. 程序計數器
    內存較小區域,可以看做當前線程執行的字節碼行號指示器。某一時刻一個CPU(核)只能運行一條線程指令,該區域稱爲"線程的私有區域",各線程之間計數器互不影響,獨立存儲。
  2. Java虛擬機棧
    線程私有,與線程生命週期相同,每個方法執行的同事都會創建一個棧用於存放局部變量引用表(編譯時所需空間確定)、操作數棧、動態鏈接、方法出口信息等。
  3. 本地方法棧
    本地方法棧功能與虛擬機棧發揮作用非常相似,區別僅在於虛擬機棧服務於虛擬機執行的Java方法,而本地方法棧則爲虛擬機使用Native方法服務。
  4. Java堆
    所有線程共享區域,虛擬機啓動時創建。唯一目的存放對象實例(數組對象),幾乎所有實例對象分配於此。GC工作的主要場所,從回收角度可分爲新生代和老生代。堆上內存可以物理上不連續,但必須邏輯上連續。
  5. 方法區
    所有線程共享區域,用於存儲虛擬機加載的類信息、常量(基本數據類型以及部分基本數據類型封裝類)、靜態變量、及時編譯器編譯後的代碼數據。
  6. 運行時常量池
    方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行時常量池存放。
  7. 直接內存
    直接內存並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域。JDK1.4新加入了NIO(New Input/Output)類,引入一種基於通道(Channel)與緩衝區(Buffer)的I/O方式,它可以使用Native的方法直接分配堆外內存,然後通過存儲在Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。

虛擬機對象

  1. 對象的創建
    Java虛擬機程序運行過程中,無時無刻都有對象被創建。在語言層次中,創建對象(錄入克隆、反序列化)通常僅僅是一個new關鍵字而已。
    虛擬機再遇到一條new指令時,首先根據指令參數能否在常量池中定位這個類的符號引用,並檢查這個符號引用的類是否已被加載、解析和初始化過。如果未加載則必須先進行加載。
    類加載後,虛擬機未新對象分配內存(內存大小分配時已確定)。
    虛擬機內存管理方式:
    ①絕對規整:已使用內存位於內存區域的一側,未使用內存區域位於另一側,中間使用指針進行標記,內存的分配將導致指針的移動
    ②相對規整:已使用內存與未使用內存相互交錯,虛擬機需要維護內存空閒表對內存進行管理。表中記錄相應內存塊首地址以及其大小
    內存分配安全:併發情況下可能導致內存分配衝突
    ①對分配內存空間的動作進行同步,保證更新操作的原子性
    ②使用本地線程分配緩衝機制,位不同線程分配不同的緩衝區,對緩衝區進行監控,並適時擴充
    在虛擬機爲對象分配好內存之後,虛擬機需要將新分配的內存區域進行清零(這就是一些基本數據類型可以進行未初始化訪問的原因)
    清零後,虛擬機會爲對象執行init方法,此時對象的創建真正完成
  2. 對象的內存佈局
    對象的內存區域可以分爲三塊:對象頭、實例數據、對齊填充
    ①對象頭包含兩部分信息:第一部分用於存儲運行時數據(哈希嗎、GC年齡、鎖狀態標誌等);第二部分爲類型指針,即對象指向它的類元數據的指針(從數組的元數據中無法確定數組長度大小,但可以通過普通Java對象的元數據信息確定Java對象的大小)。
    ②實例數據:對象真正存儲的有效信息,也是在程序中所定義的各種類型的字段內容(父類繼承的以及子類中定義的)。
    ③對齊填充:不是必然存在的,也沒有特殊意義。
  3. 對象的訪問定位
    Java的對象引用(reference)位於棧中,具體對象位於堆中。爲了使用對象,則需要建立引用與對象的關聯,目前關聯方式有:句柄關聯、直接指針關聯
    ①句柄關聯:引用(位於棧中,存放穩定句柄地址)、句柄(位於堆中,存放不穩定對象地址)、對象(位於堆中,由於GC機制的存在,地址變動頻繁)
    ②直接指針關聯:定位速度快,節省了一次指針定位的時間開銷,是目前SunHotSpot的對象訪問方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章