關於Java中可終結對象的討論通常討論當可終結對象(及其關聯資源)無法快速垃圾收集時發生的常見間接成本。一個對象可以終結的前期成本是多少?
我現在更感興趣的是,在內存條件和對象分配時間中,實際可終止的直接成本是多少。我已經看到了在一些地方這種成本的存在,拐彎抹角例如,Oracle's article on finalization memory retention issues注:
當
obj
分配,在JVM內部記錄了obj
是終結。這通常會減慢現代JVM具有的快速分配路徑。
JVM如何記錄一個對象實例是否可終止,以及這樣做的內存和性能成本如何?
對於那些有興趣在我的具體應用:
我們生產和保留數百萬難以置信的輕量級的對象;向這些對象添加單個指針的代價非常高昂,所以我們已經做了一些工作來刪除指針,而不是使用打包到字段子集中的較小數字ID。將數字解包允許從使用Map存儲它們的Pool中檢索具有該ID的共享不變屬性。
剩下的問題是如何處理不再使用的屬性值的垃圾回收。
一個已經考慮的策略是使用引用計數;當創建對象並檢索某個值的共用標識時,該值的引用計數會遞增;當它不再使用時,它必須遞減。確保這一點遞減
一種選擇的情況是添加下面的finalize方法:
public void finalize() {
Pool.release(getPropertyId());
}
但是,如果被終結的這個行爲意味着對對象的額外指針必須保持,上箭頭這個應用程序的前端成本可以被認爲是高的。如果這意味着必須分配額外的對象,那麼它幾乎肯定會太高......因此,我的問題是:可定稿的直接前期成本是多少?
是不是不好的做法,依靠的對象的終結?我的意思是,它不能保證'finalize()'會被調用 - 或者? – vikingsteve
您可能想要管理自己的對象池,而不是依靠JVM。根據您需要同時使用多少個對象,您可以通過完全避免分配/垃圾收集/最終化開銷來發現巨大的性能提升。 –
您不應該創建這麼多的可終結對象,這應該是一個問題。您應該只將它作爲最後的手段使用,否則清理對象時會發現嚴重的性能/穩定性問題。你可能不會擔心,但是使用這個很多,你會。 –