請問什麼時候物件分配會不在 TLAB 內分配

2021-10-19 08:27:16 字數 1204 閱讀 8556

我們這裡不考慮棧上分配,這些會在 jit 的章節詳細分析,我們這裡考慮的是無法棧上分配需要共享的物件

對於 hotspot jvm 實現,所有的 gc 演算法的實現都是一種對於堆記憶體的管理,也就是都實現了一種堆的抽象,它們都實現了介面 collectedheap。當分配乙個物件堆記憶體空間時,在 collectedheap 上首先都會檢查是否啟用了 tlab,如果啟用了,則會嘗試 tlab 分配;如果當前執行緒的 tlab 大小足夠,那麼從執行緒當前的 tlab 中分配;如果不夠,但是當前 tlab 剩餘空間小於最大浪費空間限制,則從堆上(一般是 eden 區) 重新申請乙個新的 tlab 進行分配。否則,直接在 tlab 外進行分配。tlab 外的分配策略,不同的 gc 演算法不同。例如g1:

重新申請乙個 tlab 進行分配,是 tlab 慢分配,不在 tlab 分配被稱為 tlab 外分配。我們可以通過 jfr 來監控 tlab 慢分配或者 tlab 外分配事件。也就是jdk.objectallocationoutsidetlabjdk.objectallocationinnewtlab這兩個事件。

jdk.objectallocationoutsidetlabjdk.objectallocationinnewtlab這兩個事件在default.jfc中( jfr 預設事件採集配置)是沒有開啟採集的:

false

true

false

true

一般的,採集這兩個事件,是需要連著堆疊一起採集,但是無法通過持續時間(因為這個事件沒有持續時間這一概念)限制採集哪些,也就是只要開啟就是全部採集,所以不建議長期開啟這個採集。而是通過一些其他的監控項,按照需要,動態開啟這個採集一段時間,之後關閉並 dump 出 jfr 檔案用於分析。

每日一刷,輕鬆提公升技術,斬獲各種offer:

Log物件什麼時候會更新LEO

leo全程log end offset,就是log最後一條記錄下一條的offset值.log物件初始化的時候,需要建立乙個新的leo物件,並對其進行初始化。寫入新訊息的時候,當不斷向log物件插入訊息時,leo會向指標一樣,不斷的增加。log物件發生日誌切分的時候,當前日誌段物件已滿的時候,會關閉當...

什麼時候返回空物件,什麼時候返回null?

1 當別人呼叫你介面的時候盡量返回null 2 當你結果直接返回前端,這時候可以返回乙個空的物件 判斷物件為空或者物件的值為空 判斷字串是否為空以及值是否為空,用lang包裡的stringutils.isblank string str 方法 stringutils.isblank null tru...

Oracle 什麼時候會觸發DBWR

checkpoint會觸發dbwr寫髒塊時是根據checkpoint queue來的,而lru w是負責dbwr的其他寫出條件的觸發。dbwr作為乙個後台程序,只有在某些條件滿足了才會觸發。這些條件包括 當程序在輔助lru鍊錶和主lru鍊錶上掃瞄以查詢可以覆蓋的buffer header時,如果已經...