java中的年轻态,14、Java垃圾回收机制(示例代码)
垃圾回收原理和算法
??Java引入了垃圾回收機制,令C++程序員最頭疼的內存管理問題迎刃而解。Java程序員可以將更多的精力放到業務邏輯上面,而不是內存管量上面,大大的提高了開發效率。這是因為Java有自動的垃圾回收機制。
內存管理
Java 的內存管理很大程度指的就是對象的管理,其中包括對象空間的分配和釋放。
對象空間的分配:使用new送鍵字創建對象即可。
以象空間的釋放:將對象賦值null即可。垃圾回收器將負責回收所有“不可達”對象的內存空間。
垃圾回收過程
任何一種垃圾回收算法一般要做兩件基本事情。
1、發現無用的對象。
2、回收無用對象占用的內存空間。
??垃圾回收機制保證可以將“無用的對象”進行回收。無用的對象指的就是沒有任何變量引用該對象。Java的垃圾回收器通過相關算法發現無用對象,并進行清除和整理。
垃圾回收的相關算法
1、引用計數法:
??堆中每個對象都有一個引用計數。被引用一次,計數加1,被引用變量值變為null,則計數減1,直到計數為0,則表示變成無用對象。優點是算法簡單,缺點是“循環引用的無用的對象“無法識別。
循環引用示例
public class Student{
String name;
Student friend;
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
s1.friend = s2;
s2.friend = s1;
s1 = null;
s2 = null;
}
}
??s1和s2相互引用對方,導致它們引用計數不為0,但是實際已是無用對象,但是無法被識別。
2、引用可達法
??程序把所有的引用關系看作一張圖,從一個節點GC ROOT 開始,尋找對應的引用節點,找到這個節點以后,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之后,剩余的節點則被認為是沒有被引用到的節點,即無用的節點。
通用的分代垃圾回收機制
分代垃圾回收機制,是基于這樣一個事實:不同的對象的生命周斯是不一樣的。因此,不同生命周期的對象可以采取不同的回收算法,可便提高回收效率。我們將對象分為三種狀態:年輕代、年老代、持久代。JVM將堆內存劃分為 (Eden 、Survivor) (年輕代) 和 (Tenured/Old) (年老代) 空間。
年輕態
所有新生成的對象首先都是放在Eden區,年輕代的目標就是盡可能的快速的收集掉那些生命周期短的以象,對應的是Minor GC,每次Minor GC 會清理年輕代的內存,算法采用效率較高的復制算法,頻繁的操作,但是會浪費內存空間。當“年輕代“區域存放滿對象后,就將對象存放到年老代區域。
年老代
在年輕代中經厲了15次垃圾回收后,仍然存活的對象,就會被放到年老代中,因些,可以認為年老代中存放的都是一些生命周期較長的對象。年老代對象越來越多,我們就就要啟動 Major GC 和 Full GC (全量回收),來一次大掃除,全面清理年輕代區域和年老代區域。
持久代
持久代用來存放態文件,如Java類,方法等,持久代對垃圾回收機制沒有顯著影響。還有就是持久代的對象存放在方法區里面。
Minor GC
用于清理年輕年區域,Eden區滿了就會觸發一次 Minor GC,清理無用對象,將有用對象復制到 Survivor1,Survivor2 區,這兩個區域,大小空間也相同,同一時刻只有一個在用,一個為空。
Major GC
用于清理老年代區域。
Full GC
用于清理年輕代、年老代。成本軟高,會對系統性能產生影響。
垃圾回收過程
1、新創建一個對,絕大多數都會存儲在Eden里面。
2、當Eden滿了之后,不能再創建新的對象了,則觸發垃圾回收機制 GC ,將無用的對象清理掉,有用的對象復制到Survivor中,比如:S1中,同時清理Eden區。
3、當Eden區再次滿了以后,會將S1中不能被清空的對象存放到另外一個Survivor中,比如:S2,同時將Eden區中的不能清空的對象,也復制到S2中,保證Eden和S1,均被清空。
4、重復多次(默認15次)以后Survivor中沒有被清理的對象,則會被復制到老年代Old區中。
5、當Old區滿了,則會觸發一個一次完整地垃圾回收(Full GC)。
JVM 調優和Full GC
在對JVM 調優的過程中,很大一部分工作就是對于 Full GC 的調節。因為Full GC 運行的時候,非常的影響性能,所以我們盡可能的不用調用到這個Full GC。
下面的原因可能導致Full GC:
1、年老代(Tenured)被寫滿。
2、持久代(perm)被寫滿。
3、System.gc() 被調用了。
4、上一次GC之后Heap的各域分配策略動態變化。
細節決定成敗!
個人愚見,如有不對,懇請扶正!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java中的年轻态,14、Java垃圾回收机制(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注册后自动登录 php,php – 自动
- 下一篇: java中exec命令,java - 从