gc電路是什么?
答案是
Garbage Collection簡(jiǎn)稱為GC,是垃圾回收的意思、內(nèi)存處理器是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰。
Java語(yǔ)言提供的GC功能可以自動(dòng)的檢測(cè)對(duì)象是否超過(guò)作用域,從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法,資源回收工作全部交由GC來(lái)完成,程序員不能精確的控制垃圾回收的時(shí)機(jī)。
GC在實(shí)現(xiàn)垃圾回收時(shí)的基本原理:
Java的內(nèi)存管理實(shí)際就是對(duì)象的管理,其中包括對(duì)像的分配和釋放。對(duì)于程序員來(lái)說(shuō),分配對(duì)象使用new關(guān)鍵字,釋放對(duì)象時(shí)只是將對(duì)象賦值為null,讓程序員不能夠再訪問(wèn)到這個(gè)對(duì)象,該對(duì)象被稱為“不可達(dá)”。GC將負(fù)責(zé)回收所有“不可達(dá)”對(duì)象的內(nèi)存空間。
對(duì)于GC來(lái)說(shuō),當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開(kāi)始監(jiān)控這個(gè)對(duì)象地址、大小以及使用情況。通常GC采用有向圖的方式記錄并管理堆中的所有對(duì)象,通過(guò)這種方式確定哪些對(duì)象是“可達(dá)”的,哪些對(duì)象是“不可達(dá)”的。當(dāng)GC確定一些對(duì)象為“不可達(dá)時(shí)”GC就有責(zé)任回收這些內(nèi)存空間,但為了GC能夠在不同的平臺(tái)上實(shí)現(xiàn),java規(guī)范對(duì)GC的很多行為都沒(méi)有進(jìn)行嚴(yán)格的規(guī)定。例如對(duì)于采用什么類型的回收算法、什么時(shí)候進(jìn)行回收等重要問(wèn)題都沒(méi)有明確的規(guī)定,因此不同的JVM實(shí)現(xiàn)著不同的的實(shí)現(xiàn)算法,這也給JAVA程序員的開(kāi)發(fā)帶來(lái)了很多不確定性。
根據(jù)GC的工作原理,可以通過(guò)一些技巧和方式讓GC運(yùn)行更快,高效而又合理。編程建議如下:
1、盡早釋放無(wú)用對(duì)象的引用,特別注意一些復(fù)雜對(duì)象,如數(shù)組,隊(duì)列等。對(duì)于此類對(duì)象,GC回收它們的效率一般較低,如果程序允許,應(yīng)盡早將不用的引用對(duì)象賦為null,這樣可以加速GC的工作。
2、盡量少用finalize函數(shù)。finalize是java提供給程序員用來(lái)釋放對(duì)象或資源的函數(shù),但是它會(huì)加大GC的工作量,因此盡量少采用finalize函數(shù)回收資源。
當(dāng)程序有一定的等待時(shí)間,程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是java語(yǔ)言規(guī)范并不保證GC一定會(huì)執(zhí)行。
finalize是什么?
finalize是方法名,java技術(shù)允許使用finalize()方法在垃圾收集器從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象的調(diào)用的。它是在Object類定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象的調(diào)用的。