java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作
垃圾回收原理和算法
內存管理
Java的內存管理很大程度指的就是對象的管理,其中包括對象空間的分配和釋放。
對象空間的分配:使用new關鍵字創建對象即可
對象空間的釋放:將對象賦值null即可
垃圾回收器將負責回收所有”不可達”對象的內存空間
垃圾回收過程
任何一種垃圾回收算法一般要做兩件基本事情:
1. 發現無用的對象
2. 回收無用對象占用的內存空間。
垃圾回收相關算法
? ? ? ? 1. 引用計數法
? ? ? ? ? ?堆中每個對象都有一個引用計數。被引用一次,計數加1. 被引用變量值變為null,則計數減1,直到計數為0,則表示變成無用對象。優點是算法簡單,缺點是“循環引用的無用對象”無法別識別。
? ? ? ?2. 引用可達法(根搜索算法)
通用的分代垃圾回收機制
? ? ? ?分代垃圾回收機制,是基于這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的回收算法,以便提高回收效率。我們將對象分為三種狀態:年輕代、年老代、持久代。JVM將堆內存劃分為 Eden、Survivor 和 Tenured/Old 空間。
? ? ? ?1. 年輕代
? ? ? ? ?所有新生成的對象首先都是放在Eden區。 年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象,對應的是Minor GC,每次 Minor GC 會清理年輕代的內存,算法采用效率較高的復制算法,頻繁的操作,但是會浪費內存空間。當“年輕代”區域存放滿對象后,就將對象存放到年老代區域。
? ? ? ? 2. 年老代
? ? ? ? 在年輕代中經歷了N(默認15)次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。年老代對象越來越多,我們就需要啟動Major GC和Full GC(全量回收),來一次大掃除,全面清理年輕代區域和年老代區域。
3. 持久代
? ? ? ?用于存放靜態文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響
?
? ? ? ? Minor GC:
用于清理年輕代區域。Eden區滿了就會觸發一次Minor GC。清理無用對象,將有用對象復制到“Survivor1”、“Survivor2”區中(這兩個區,大小空間也相同,同一時刻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(Tenured)區中,
? ? 5、當Old區滿了,則會觸發一個一次完整地垃圾回收(FullGC),之前新生代的垃圾回收稱為(minorGC)
?JVM調優和Full GC
在對JVM調優的過程中,很大一部分工作就是對于Full GC的調節。有如下原因可能導致Full GC:
1.年老代(Tenured)被寫滿
2.持久代(Perm)被寫滿
3.System.gc()被顯式調用(程序建議GC啟動,不是調用GC)
4.上一次GC之后Heap的各域分配策略動態變化
開發中容易造成內存泄露的操作
注:在實際開發中,內存泄露經常會造成系統的崩潰。
? ? ? ?1. 程序員無權調用垃圾回收器。
2. 程序員可以調用System.gc(),該方法只是通知JVM,并不是運行垃圾回收器。盡量少用,會申請啟動Full GC,成本高,影響系統性能。
3. finalize方法,是Java提供給程序員用來釋放對象或資源的方法,但是盡量少用。
總結
以上是生活随笔為你收集整理的java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java知识点7——面向过程和面向对象、
- 下一篇: Java的知识点9——this关键字