JAVA垃圾回收机制
大家好,我是皮卡,這次分享的是JAVA垃圾回收機制,如果有需要或是感興趣的話,就一起看下去吧~
目錄
一、手動垃圾回收機制
二、自動垃圾回收機制
1、概念
2、判斷哪些對象有用
3、finalize方法——final、finally、finalize區(qū)別
4、觸發(fā)垃圾回收的條件
5、java中的釋放資源與垃圾回收機制區(qū)別
6、減少GC垃圾回收開銷
一、手動垃圾回收機制(C/C++)
手動:使用過的對象必須要程序員自己來回收
缺點:
1??若程序員忘記及時回收——對象會一直在內(nèi)存中,若程序運行時間很長,內(nèi)存中存在大量垃圾,空間越來越滿,之后創(chuàng)建的對象沒有內(nèi)存可用——>導致內(nèi)存泄漏、降低系統(tǒng)性能
2??程序員自己回收可能存在誤收操作——導致系統(tǒng)崩潰
二、自動垃圾回收機制(Java)
1、垃圾回收機制(GC):通過自動垃圾回收算法對堆內(nèi)存中 new出的且不再被引用的對象 進行回收
2、垃圾回收機制如何判斷對象是否還有用?
? ? ? 檢查堆內(nèi)存中空間是否充裕:
- 足夠,則不回收
- 不足,通過算法檢查是否有 已創(chuàng)建 且長時間未被引用的對象——>若長時間未被引用 且急需創(chuàng)建新的對象,垃圾回收機制就會將這些對象定為垃圾,會優(yōu)先將這部分空間進行回收
3、垃圾回收機制在回收任何對象之前,總會先自動調(diào)用 finalize()方法(自動調(diào)用,不由程序員調(diào)用),調(diào)用該方法可以在垃圾回收同時打印日志等操作
注:finalize可以用來清理不是new出的對象所占用的內(nèi)存,可以用來清理本地對象
本地對象:指的是在Java中調(diào)用非Java代碼(C/C++)時創(chuàng)建的對象
protected void finalize() throws Throwable { }下面是我在一次面試中面試官問到我的問題,大家也可以看下~
final、finally、finalize的區(qū)別
final:修飾符,被final修飾的變量不能被修改,被final修飾的方法不能被重寫,被final修飾的類不能被繼承
finally:在異常處理時,用于最終進行收尾工作的代碼塊
finalize:Object中提供的方法,用于垃圾回收之前自動被垃圾回收器調(diào)用的方法
對象在內(nèi)存中的狀態(tài)轉(zhuǎn)換【具體內(nèi)容我們在下期分享】
4、觸發(fā)垃圾回收的條件
- 當沒有線程在運行時,垃圾回收會被調(diào)用。因為垃圾回收在優(yōu)先級最低的線程中進行,當應用忙時,垃圾回收不被調(diào)用(不是由程序員自己調(diào)用的),但除第二點
- 堆內(nèi)存不足時會觸發(fā)垃圾回收機制
? ? ? 自動回收機制——>程序員無法精確控制垃圾回收的執(zhí)行,可以通過System.gc() 或 Runtime.getRuntime().gc() 來通知JVM進行垃圾回收,但系統(tǒng)是否進行垃圾回收依舊不確定
public class TestGC {public static void main(String[] args) {TestGC testGC = new TestGC();testGC = null;System.gc(); // 通知垃圾回收器來回收垃圾,但是否進行垃圾回收依舊不確定,因為這不是程序員控制的}@Overrideprotected void finalize() throws Throwable {System.out.println("對象被GC回收");} }情況一:被回收
情況二:沒有被回收
5、Java中釋放資源與垃圾回收機制的區(qū)別
- 垃圾回收只能釋放內(nèi)存中的資源,不能釋放與內(nèi)存無關的資源
- 垃圾回收具有不確定性,程序員無法精確控制垃圾回收的執(zhí)行,沒有確定的回收時間
- IO流資源不能被GC直接釋放(IO流使用了虛擬機之外的資源,所以虛擬機無法通過垃圾回收釋放資源),但可以通過finalize方法釋放。該方法防止程序員忘記需要手動釋放資源——依舊需要手動調(diào)用close方法釋放資源。
上述說到finalize方法執(zhí)行在垃圾回收機制之前,但垃圾回收機制具有不確定性,不確定什么時候進行垃圾回收。所以finalize方法無法保證對 手動需要釋放的資源 進行及時回收。
protected void finalize() throws IOException {if ((fd != null) && (fd != FileDescriptor.in)) {/* if fd is shared, the references in FileDescriptor* will ensure that finalizer is only called when* safe to do so. All references using the fd have* become unreachable. We can call close()*/close();}}6、減少GC垃圾回收開銷
-
盡量不要顯式調(diào)用System.gc()
? ? ? 會增加GC的頻率,但不能保證清除所有垃圾。GC也是一個線程,會消耗資源,可能會造成間歇性停頓次數(shù)(運行時是間歇進行的)。
好啦,就先到這里吧~
喜歡我的可以點贊、關注、收藏,如果有什么技術上的疑問,歡迎留言或私信~?
我們下次見~
總結
以上是生活随笔為你收集整理的JAVA垃圾回收机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet技术简介与编写、编译Ser
- 下一篇: Brad Wilson写的 ASP.NE