GC是什么故黑?為什么要有GC刻恭?原文地址
? ? ? ?GC是垃圾收集的意思,內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰羽戒,Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的输莺,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法甫男。Java程序員不用擔(dān)心內(nèi)存管理攘已,因?yàn)槔占鲿詣舆M(jìn)行管理。要請求垃圾收集澜共,可以調(diào)用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 向叉,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用。
? ? ? ?垃圾回收可以有效的防止內(nèi)存泄露嗦董,有效的使用可以使用的內(nèi)存母谎。垃圾回收器通常是作為一個單獨(dú)的低優(yōu)先級的線程運(yùn)行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時(shí)間沒有使用的對象進(jìn)行清除和回收京革,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對某個對象或所有對象進(jìn)行垃圾回收奇唤。在Java誕生初期幸斥,垃圾回收是Java最大的亮點(diǎn)之一,因?yàn)榉?wù)器端的編程需要有效的防止內(nèi)存泄露問題咬扇,然而時(shí)過境遷甲葬,如今Java的垃圾回收機(jī)制已經(jīng)成為被詬病的東西。移動智能終端用戶通常覺得iOS的系統(tǒng)比Android系統(tǒng)有更好的用戶體驗(yàn)懈贺,其中一個深層次的原因就在于Android系統(tǒng)中垃圾回收的不可預(yù)知性经窖。
補(bǔ)充:垃圾回收機(jī)制有很多種,包括:分代復(fù)制垃圾回收梭灿、標(biāo)記垃圾回收画侣、增量垃圾回收等方式。標(biāo)準(zhǔn)的Java進(jìn)程既有棧又有堆堡妒。棧保存了原始型局部變量配乱,堆保存了要創(chuàng)建的對象。Java平臺對堆內(nèi)存回收和再利用的基本算法被稱為標(biāo)記和清除涕蚤,但是Java對其進(jìn)行了改進(jìn)宪卿,采用“分代式垃圾收集”。這種方法會跟Java對象的生命周期將堆內(nèi)存劃分為不同的區(qū)域万栅,在垃圾收集過程中,可能會將對象移動到不同區(qū)域:
- 伊甸園(Eden):這是對象最初誕生的區(qū)域西疤,并且對大多數(shù)對象來說烦粒,這里是它們唯一存在過的區(qū)域。
- 幸存者樂園(Survivor):從伊甸園幸存下來的對象會被挪到這里代赁。
- 終身頤養(yǎng)園(Tenured):這是足夠老的幸存對象的歸宿扰她。年輕代收集(Minor-GC)過程是不會觸及這個地方的。當(dāng)年輕代收集不能把對象放進(jìn)終身頤養(yǎng)園時(shí)芭碍,就會觸發(fā)一次完全收集(Major-GC)徒役,這里可能還會牽扯到壓縮,以便為大對象騰出足夠的空間窖壕。
與垃圾回收相關(guān)的JVM參數(shù):
-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年輕代的大小
-XX:-DisableExplicitGC — 讓System.gc()不產(chǎn)生任何作用
-XX:+PrintGCDetails — 打印GC的細(xì)節(jié)
-XX:+PrintGCDateStamps — 打印GC操作的時(shí)間戳
-XX:NewSize / XX:MaxNewSize — 設(shè)置新生代大小/新生代最大大小
-XX:NewRatio — 可以設(shè)置老生代和新生代的比例
-XX:PrintTenuringDistribution — 設(shè)置每次新生代GC后輸出幸存者樂園中對象年齡的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設(shè)置老年代閥值的初始值和最大值
-XX:TargetSurvivorRatio:設(shè)置幸存區(qū)的目標(biāo)使用率