什麼是垃圾
可以有不同的理解方式
- 俠義且標準的理解要從C++層面理解:沒有任何指針指向的內存,程序無法再訪問到,但是卻佔據了內存。這也是標準的內存溢出的理解。(這種理解可以被看做是C++垃圾的定義)
- 更廣義一些,再java層面理解:不在被任何java程序中的引用所指向的內存,是垃圾(這種可以被看做是java的定義,我們java中所說的垃圾就是指這種理解)
- 再廣義一些,就是程序後面的運行,根據需求,不再需要被使用的內存,但是這部分內存還是有指針指向的。(如果再程序中需要再度優化,便可以這樣理解,我們可以將只在程序啓動時用到的類或者對象,在程序啓動之後可以理解爲垃圾)。
爲什麼需要GC
如果不及時垃圾收集和清理,垃圾會一直伴隨程序運行而結束。如果不收集垃圾,內存遲早用完。
除了釋放無用的內存,垃圾回收也可以清理內存中的記錄碎片。
隨着應用程序的業務越來越龐大,GC也需要跟上時代。
垃圾收集不是java語言的半生產物。早在1960年,第一門開始使用內存動態分配和垃圾收集技術在Lisp語言誕生。
垃圾收集三個經典問題:
- 哪些內存需要回收
- 什麼時候回收
- 如何回收
垃圾收集機制是java的招牌能力,極大提高了開發效率。如今垃圾收集幾乎稱爲現代語言的標配。如今垃圾回收機制仍在不斷演進。
早期垃圾回收
C/C++ 手動delete:
int* p = new int;*p = 5;delete p;
java垃圾回收機制
自動內存管理,無需手動參與內存的分配和回收,降低內存泄漏的風險。
如果沒有垃圾回收機制,就會像c++ 一樣,各種垂懸指針,野指針出現。
擔憂
自動內存管理就像一個黑匣子,過度依賴,嚴重弱化java程序員解決內存溢出時定位和解決問題的能力