JVM 三 物件的儲存策略(棧上分配和TLAB)

2021-10-20 02:55:14 字數 1731 閱讀 7824

我們都知道物件是儲存在堆裡的,但物件是不是只能儲存在堆裡呢?答案是否定的,事實上jvm在new乙個物件的時候,有一套專門的儲存策略來決定這個物件應該被放在哪。簡單點說,在jvm裡,物件不僅僅會被儲存在堆裡,也可能被儲存在棧上。

這裡先直接給乙個流程圖,來簡單直觀的說明jvm分配物件時的具體策略:

然後我們再以下面的**為例,結合流程圖,逐步的來**jvm在建立person物件的時候都有哪些操作。

public

void

test()

我們來看上面的**,首先,當test方法被呼叫時,jvm需要建立乙個person物件,我們假設person是乙個「小物件」。從**中我們可以得出例項p只在方法test內存活,所以jvm第一步會嘗試在虛擬機器棧的棧幀中分配該物件的儲存空間。這種分配方式一般稱為「棧上分配」,需要的是,棧上分配有三個必須的前提:

物件較小

jvm開啟了逃逸分析且當前物件未逃逸出當前方法(如上述偽**,物件p僅在test方法內活躍)

jvm開啟了標量替換

那什麼是逃逸分析和標量替換呢?

棧上分配最直接的好處是物件的記憶體空間會隨著方法呼叫的結束而被**,也就是棧幀出棧。這可以減輕gc的壓力,提高系統效能。

倘若棧上分配的前提條件未滿足,那麼jvm下一步會嘗試在tlab中分配該物件的儲存空間。tlab的全稱是thread local allocation buffer,即執行緒本地快取區,這是jvm提供給執行緒專用的記憶體分配區域,它本身歸屬與堆記憶體中的eden區。

由於物件通常會被分配在堆上(不能棧上分配的物件是很常見的),而堆是全域性共享的,如果讓每個執行緒建立物件時都直接向堆申請,一旦執行緒數上去了,執行緒對堆空間的申請會存在非常激烈的競爭。為了減少這種競爭現象,jvm設計了tlab,讓每個執行緒在eden區都有一塊屬於自己的記憶體空間。tlab空間實際非常的小,所以通常只有小物件才能放在這上面,當然tlab的大小也可以通過jvm的引數指定-xx:+tlabsize。

當乙個執行緒的tlab空間快裝滿時,jvm會給該執行緒再分配乙個新的tlab空間,而原先的tlab空間會被放棄。當然這裡的放棄不是說原先的tlab空間會被**,而是說這個空間將回歸eden區。也就是重新成為eden區的普通乙份子,而不再是某乙個執行緒獨享的物件分配區。

如何判斷乙個tlab空間是否快裝滿也是有標準的,jvm有乙個稱為tlab空間浪費比例的引數,假設我們的tlab空間有100kb大,而設定的tlab空間浪費比例時1/5,那麼當tlab剩餘的可用空間小於 100kb * 1/5 = 20kb時,這個tlab空間就會被放棄,jvm會重新申請乙個tlab空間給該執行緒。

預設情況下,jvm會根據執行的情況自動調整tlab的大小和tlab空間浪費比例。

就像最開始給的流程圖一樣,倘若乙個物件沒能進入tlab區,那麼jvm下一步會判斷該物件是否可以直接進入老年代,判斷的標準來自於jvm引數 -xx:pretenuresizethreshold,如果物件的大小大於該引數設定的值,那麼這個物件就會直接被分配到老年代,反之該物件就會進入eden區。但值得注意的是,預設情況下-xx:pretenuresizethreshold的值是0,這代表著在沒有特別指定的情況下,任何物件都會先在eden區嘗試分配,除非eden區分配不下了才會直接進入老年代。

另外,-xx:pretenuresizethreshold這個引數僅在serial (序列收集器)和parnew(serial收集器的多執行緒版本)這兩個收集器下有效

Java筆記三 物件封裝

將方法寫在類中,稱為封裝 無論多少個物件都可以重複用該方法 封裝為私有資料private 隱藏物件細節,將物件當做黑箱操作 使用者必須通過提供的方法呼叫來操作物件 方法名稱首字母是小寫的 變數首字母是小寫的 類名首字元是大寫的 沒有任何定義許可權關鍵字時,就是包許可權 若想在其他包的類中使用,需要用...

阿里雲服務(三) 物件儲存OSS和塊儲存

五 物件儲存oss 塊儲存適合存放本地使用的一些檔案,而且成本比較高,容量也有一些限制,不是適合資料量龐大的大資料。3 物件儲存oss的計費和限制 物件儲存oss的計費方式 oss的計費方式分為按量付費和包年包月兩種 按量付費 按實際使用量 單價的方式計費,每小時統計前一小時的實際用量並從賬戶餘額中...

js基礎總結(三)物件,函式

物件 1.什麼是物件?代表現實中的某個事物,是該事物在程式設計中的抽象。多個資料的集合體 封裝體 用來儲存多個資料的容器。2.為什麼要用物件?便於對多個資料進行統一管理。3.物件的組成 屬性 屬性名 字串 和屬性值組成。代表現實事物的狀態資料 屬性名是字串型別,屬性值是任意型別。方法 一種特別的屬性...