java final 变量 回收_在Java中将final用于变量会改善垃圾回收吗?
小編典典
這是一個稍有不同的示例,其中包含最終引用類型字段而不是最終值類型局部變量:
public class MyClass {
public final MyOtherObject obj;
}
每次創建MyClass實例時,都將創建對MyOtherObject實例的傳出引用,GC必須遵循該鏈接來查找活動對象。
JVM使用標記掃描GC算法,該算法必須檢查GC“根”位置中的所有實時裁判(如當前調用堆棧中的所有對象)。每個活動對象都被“標記為”活動,活動對象所引用的任何對象也都被標記為活動。
標記階段完成后,GC會掃描堆,釋放所有未標記對象的內存(并壓縮剩余活動對象的內存)。
同樣,重要的是要認識到Java堆內存被劃分為“年輕”和“舊”。所有對象最初都是在年輕一代(有時稱為“苗圃”)中分配的。由于大多數對象都是短命的,因此GC在從年輕一代釋放最新垃圾方面更加積極。如果某個對象在年輕一代的收集周期中幸存下來,則將其移入舊一代(有時稱為“終身一代”),該對象的處理頻率較低。
因此,我想說的是:“不,’最終’修飾符無法幫助GC減少工作量”。
我認為,在Java中優化您的內存管理的最佳策略是盡快消除虛假引用。您可以通過在使用完對象后立即為對象引用分配“ null”來做到這一點。
或者更好的是,最小化每個聲明范圍的大小。例如,如果您在1000行方法的開頭聲明了一個對象,并且該對象在該方法作用域關閉之前(最后一個大括號)一直保持活動狀態,則該對象可能會存活更長的時間必要。
如果您使用小的方法,只有十幾行代碼,則在該方法中聲明的對象將更快地超出范圍,并且GC將能夠在效率更高的范圍內完成大部分工作年輕一代。除非絕對必要,否則您不希望將對象移入較早的一代。
2020-09-15
總結
以上是生活随笔為你收集整理的java final 变量 回收_在Java中将final用于变量会改善垃圾回收吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java bigdecimal乘法_Ja
- 下一篇: java round指令_Java PA