《JVM垃圾回收相關內容》開發中,如何盡量減少GC開銷,減輕垃圾回收的負擔


前言:這段時間回顧了一下GC的相關知識,理論可以指導實踐,學習的目的就是為了使用。所以,在平時的開發中,如何寫代碼,可以減少
GC開銷,是我一直思考的問題,帶着這個問題,我找到了網上的這些內容,總結的不錯,我認為很好。美中不足的是,理論說的好,但是如何
實操,沒有做進一步的引導。我稍加修改,加上自己的理解,從實操性上進行了增減,以饗讀者。水平有限,如有不足之處,請見諒。


    第一點:不要顯式調用System.gc()方法。調用System.gc()雖然不一定會觸發Major GC,但還是有可能觸發的。一旦觸發Major GC,就會造成
程序執行中斷,影響系統性能。


    第二點:盡量減少臨時對象的使用。臨時對象在方法執行完以后,就會成為垃圾。少用臨時對象就相當於減少了垃圾的產生。


    第三點:對象不用時最好顯式置為null。一般而言,為null的對象都會被作為垃圾處理,所以將不用的對象顯式地設為null,有利於GC收集器
判定垃圾,提高GC效率。在實際開發中,我們應該怎么做呢?例如我們創建了一個List對象,當List使用完以后,我們可以List = null


    第四點:進行字符串拼接操作時,盡量使用StringBuffer代替String。String是不可變類,生成的對象是固定長度的。拼接String時,會創建
多個String對象。而這些對象,在方法執行完以后,都成為了垃圾。使用StringBuffer時,只會創建一個StringBuffer對象和一個字符數組。所以
在進行多字符串的拼接時,最好使用StringBuffer。


    第五點:盡量使用基本類型如int,long,而不使用他們的包裝類Integer,Long。基本類型變量占用的內存資源比包裝類對象少得多。有興趣
的朋友,可以思考一個問題:int變量占用的內存空間是多大?Integer對象占用的內容空間是多大?(這里會用到java對象的內存結構的相關知識
,對象如何分配內存,每個部分分配多大內存)在JDK5.0以后,因為加入了自動類型裝換,因此,Java虛擬機會在存儲方面進行相應的優化。


    第六點:盡量減少static對象和static變量。static靜態變量屬於全局變量,不會被GC回收。


    第七點:分散對象創建或刪除的時間。集中在短時間內大量創建新對象,特別是大對象,會導致突然需要大量內存,JVM在面臨這種情況時,只
能進行Major GC,以回收內存或整合內存碎片。集中刪除對象,道理也是一樣的。它使得突然出現了大量的垃圾對象,空閑空間必然減少,從而大大
增加了下一次創建新對象時強制Major GC的機會。(Major GC,發生在永久代的GC)

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: