面試官:new 關鍵字在 JVM 中是如何執行的?
問:new 關鍵字在虛擬機器中是怎樣的一個過程?JVM 構造物件的步驟都有哪些?
1、解答
2、Java物件建立流程
指標碰撞
如果Java堆中的記憶體是絕對規整的,所有用過的記憶體都放在一邊,空閒的記憶體放在另一邊,中間放著一個指標作為分界點的指示器,那所分配記憶體就僅僅是把那個指標向空閒空間那邊揶動一段與物件大小相等的距離,這種分配方式稱為“指標碰撞”(Bump the Pointer)。
空閒列表
如果Java堆中的記憶體並不是規整的,已使用的記憶體和空閒的記憶體相互交錯,那就沒有辦法簡單地進行指標碰撞了,虛擬機器就必須維護一個列表,記錄上哪些記憶體塊是可用的,在分配的時候從列表中找到一塊足夠大的空間劃分給物件例項,並更新列表上的記錄,這種分配方式稱為“空閒列表”(Free List)。
怎麼判斷Java堆記憶體是否規整?
Java 堆是否規整由所採用的垃圾收集器是否帶有壓縮整理功能決定。使用標記整理法比如Serial、 ParNew的收集器時,系統採用的分配演算法是指標碰撞, 而使用標記清理法比如CMS的收集器時,則通常採用空閒列表。
怎樣保障建立物件時的執行緒安全性?
問題說明
物件建立在虛擬機器中是非常頻繁的行為,即使是僅僅修改一個指標所指向的位置,在併發情況下也並不是執行緒安全的,可能出現正在給物件 A 分配記憶體,指標還沒來得及修改,物件B又同時使用了原來的指標來分配記憶體的情況。
解決方案
- 對分配記憶體空間的動作進行同步處理,虛擬機器採用CAS配上失敗重試的方式保證更新操作的原子性。
- 把記憶體分配的動作按照執行緒劃分在不同的空間之中進行,即每個執行緒在Java雄中預先分配一小塊記憶體,稱為本地執行緒分配緩衝TLAB(Thread Local Allocation Buffer)。哪個執行緒要分配記憶體,就在哪個執行緒的TLAB上分配,只有TLAB用完並分配新的TLAB時,才需要同步鎖定。
來源:http://blog.csdn.net/Shockang/article/details/116724401
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!
3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式釋出,全新顛覆性版本!
覺得不錯,別忘了隨手點贊+轉發哦!
- Java 中的屠龍之術:如何修改語法樹?
- 採集 Nginx 日誌的幾種方式,你知道幾種?
- Group By 深度優化,真是絕了!
- 面試官:Redis 單執行緒已經很快,為何 6.0要引入多執行緒?有啥優勢?
- 國產 Linux 發行版再添一員,介面不輸蘋果!太漂亮了。。
- Spring Boot Actuator 健康檢查、度量、指標收集、監控,一文搞定!
- for 迴圈的 5 種寫法,哪種最快?
- MySQL 是如何實現 ACID 的?
- 一招搞定 Spring Boot 視覺化監控!
- MyBatis vs Hibernate,到底哪個效能更好?
- Java 程式設計師必須掌握的 10 款開源工具!
- 如何搭建一臺永久執行的個人伺服器?試試這個黑科技!
- 面試官:生成訂單 30 分鐘未支付,則自動取消,該怎麼實現?
- 一招搞定 Spring Boot 視覺化監控!
- 你還在 Docker 中跑 MySQL?恭喜你,可以下崗了!
- Java 如何模擬真正的併發請求?
- 用好這個 IDEA 外掛,寫程式碼效率至少提升 5 倍!
- YAML 有漏洞被棄用?網友:YAML 不背鍋!
- 億級流量架構怎麼做資源隔離?寫得太好了!
- 還在用 Log4j ?快用 Log4j2,效能太猛了!