面試官:new 關鍵字在 JVM 中是如何執行的?

語言: CN / TW / HK

問:new 關鍵字在虛擬機器中是怎樣的一個過程?JVM 構造物件的步驟都有哪些?

1、解答

2、Java物件建立流程

指標碰撞

如果Java堆中的記憶體是絕對規整的,所有用過的記憶體都放在一邊,空閒的記憶體放在另一邊,中間放著一個指標作為分界點的指示器,那所分配記憶體就僅僅是把那個指標向空閒空間那邊揶動一段與物件大小相等的距離,這種分配方式稱為“指標碰撞”(Bump the Pointer)。

空閒列表

如果Java堆中的記憶體並不是規整的,已使用的記憶體和空閒的記憶體相互交錯,那就沒有辦法簡單地進行指標碰撞了,虛擬機器就必須維護一個列表,記錄上哪些記憶體塊是可用的,在分配的時候從列表中找到一塊足夠大的空間劃分給物件例項,並更新列表上的記錄,這種分配方式稱為“空閒列表”(Free List)。

怎麼判斷Java堆記憶體是否規整?

Java 堆是否規整由所採用的垃圾收集器是否帶有壓縮整理功能決定。使用標記整理法比如Serial、 ParNew的收集器時,系統採用的分配演算法是指標碰撞, 而使用標記清理法比如CMS的收集器時,則通常採用空閒列表。

怎樣保障建立物件時的執行緒安全性?

問題說明

物件建立在虛擬機器中是非常頻繁的行為,即使是僅僅修改一個指標所指向的位置,在併發情況下也並不是執行緒安全的,可能出現正在給物件 A 分配記憶體,指標還沒來得及修改,物件B又同時使用了原來的指標來分配記憶體的情況。

解決方案

  1. 對分配記憶體空間的動作進行同步處理,虛擬機器採用CAS配上失敗重試的方式保證更新操作的原子性。
  2. 把記憶體分配的動作按照執行緒劃分在不同的空間之中進行,即每個執行緒在Java雄中預先分配一小塊記憶體,稱為本地執行緒分配緩衝TLAB(Thread Local Allocation Buffer)。哪個執行緒要分配記憶體,就在哪個執行緒的TLAB上分配,只有TLAB用完並分配新的TLAB時,才需要同步鎖定。

來源:https://blog.csdn.net/Shockang/article/details/116724401

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式釋出,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!