java创建对象的过程_Java创建对象的过程
Java創建對象的過程
Java是一門面向對象的編程語言,在Java程序運行過程中每時每刻都有對象被創建出來。在語言層面上,創建對象通常僅僅是一個new關鍵字而已,而在虛擬機中,對象的創建又是怎樣一個過程呢?
一、檢測類是否被加載
虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執行相應的類加載過程。
二、為新生對象分配內存
在類加載檢查通過后,接下來虛擬機將為新生對象分配內存。對象所需內存的大小在類加載完成后便可完全確定。
假設Java堆中內存是絕對規整的,所有用過的內存都放在一邊,空閑的內存放在另一邊,中間放著一個指針作為分界點的指示器,那么分配內存就僅僅是把那個指針向空閑空間那邊挪動一段與對象大小相等的距離,這種分配方式稱為“指針碰撞”。
如果Java堆中的內存并不是規整的,已使用的內存和空閑的內存相互交錯,那就沒有辦法簡單地進行指針碰撞了,虛擬機就必須維護個列表,記錄上哪些內存塊是可用的,在分配的時候從列表中找到一塊足夠大的空間劃分給對象實例,并更新列表上的記錄,這種分配方式稱為“空閑列表”。
選擇哪種分配方式由Java堆是否規整決定,而Java堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。
三、初始化零值
內存分配完成后,虛擬機需要將分配到的內存空間都初始化為零值(不包括對象頭),這一步操作保證了對象的實例字段在Java代碼中可以不賦初始值就直接使用,程序能訪問到這些字段的數據類型所對應的零值。
四、進行必要的設置
接下來,虛擬機要對對象進行必要的設置,例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象的對象頭之中。
五、執行init方法
在上面工作都完成之后,從虛擬機的視角來看,一個新的對象已經產生了,但從Java程序的視角來看,對象創建才剛開始,方法還沒有執行,所有的字段都還為零。所以一般來說,執行new指令之后會接著執行方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全產生出來。
總結一下上面所說的,創建一個對象的過程就是:
檢測類是否被加載沒有加載的先加載→為新生對象分配內存→將分配到的內存空間都初始化為零值→對對象進行必要的設置→執行方法把對象進行初始化
這樣一個對象就創建完成了,是不是很簡單。
本貼是博主對《深入理解Java虛擬機》的書摘,為博主原創。
總結
以上是生活随笔為你收集整理的java创建对象的过程_Java创建对象的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: K9为印度国产坦克?
- 下一篇: java 5 2_java 图形界面5.