張衛


摘要:java語言作為一中優秀的編程語言,其優秀之因素一個比較重要的方面就是具有自動垃圾回收機制,垃圾回收可以減少程序員的工作量,提升程序的執行效率。本文對垃圾回收機制做了研究說明。
關鍵詞:GC;垃圾回收機制;java;jvm;程序
中圖分類號:TP312 文獻標識碼:A 文章編號:1007-9416(2017)02-0231-01
Java語言由于其良好的跨平臺性而得到廣泛應用,作為C++的改良語言,java增加了垃圾回收機制,從而避免了C++運行時由于忘記釋放對象而帶來的內存泄漏問題。Java中,運行需要的對象名稱存放在棧中,而該對象實例化后的數據保存在堆中,如果一個棧中的對象不再指向原來堆中的數據時,則這個對象所占用的內存空間就是一個垃圾,Java運行環境中JVM的一個系統線程能及時釋放一些無用信息。Java代碼執行順序如圖1所示。
從中可知垃圾回收是在一個程序運行塊的最后一個環節(實際執行過程中這個過程是循環的,垃圾回收時間是由算法加權得到不可預測)。它是一個動態存儲管理技術,自動釋放不再被引用的對象,這個釋放的過程按照一定的算法來實現。在java中沒有c++中的delete命令但是其中系統提供了gc方法回收垃圾。下面對GC機制下的gc方法進行測試:
1 測試代碼
測試代碼如圖2所示。
2 測試環境
測試環境是在安裝jdk和jre的電腦上,通過控制臺調用javac編譯器編譯生成類文件,然后調用java命令執行該類文件,在后面配置-verbosegc參數可以查看程序使用堆內存的情況,如圖3所示。
3 測試結果
從測試結果截圖中可以看到系統共收回848-617=231K的空間,括號里面的125952K表示堆內存總容量,共使用了0.0105963秒。
上面測試中使用了系統gc方法回收垃圾,但是為了減少使用GC而導致的間歇性停頓,盡量不要顯式調用系統gc方法。系統GC的觸發條件是應用程序空閑時,或者java堆內存不足時,前者是為了不占用系統后期程序運行時間而設置的優化,而后者是強制調用,出現堆內存不足時系統會回收內存用于重新分配,如果內存還是不夠的情況下,系統會再進行兩次GC調用,如果還是無法滿足條件,就會報出內存溢出的錯誤。
GC在進行垃圾回收時,會首先調用finalize函數,這個函數的作用是釋放一些其他做法開辟的內存空間,由于java垃圾回收器默認只知道回收由new方法分配的內存空間,而一些如調用c語言malloc函數分配的空間或者打開的文件資源等,java垃圾回收機制不會主動收回,這時候可以在finalize方法中出一些清理工作,需要對該函數的一個重寫工作,在重寫的過程中可以對特殊空間進行一些處理。
在垃圾回收機制中,垃圾是要按照一定的算法回收的,通常提供的算法有以下幾種:
(1)增量收集法(Incremental Collecting)。增量收集法是在應用運行的時候運行算法進行垃圾回收,但是在JDK5以后不再使用該算法,此處不敘。
(2)引用計數法(Reference Counting)。這是一種比較傳統的垃圾回收算法,在某個對象被使用的時候,讓引用計數加1,刪除某個對象的引用后,就讓引用計數減1,如此在一個對象正常引用結束的時候,引用計數為0,在GC回收內存的時候,只用手機引用計數為0的對象。但是這個算法無法解決對象的循環引用。
4 結語
垃圾回收機制給程序員的開發帶來了極大的便利,垃圾回收能自動釋放內存空間,減輕編程的負擔。這使Java 虛擬機具有一些優點。首先在編程效率方面,垃圾回收機制幫助程序員解決了很多難懂的存儲器問題,同時垃圾回收機制提升程序的安全性,保護程序的完整。