《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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章