前面提到過,java的堆內存被分代管理,分代管理主要是爲了方便垃圾回收,這樣作基於2個事實,第1、大部分對象很快就再也不使用,第二,還有一部分不會當即無用,但也不會持續很長時間。java
虛擬機中劃分爲年輕代、老年代、和永久代。算法
1>年輕代:主要用來存放新建立的對象,年輕代分爲eden區和兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象會在兩個Survivor區交替保存,達到必定次數的對象會晉升到老年代。jvm
2>老年代:用來存放從年輕代晉升而來的,存活時間較長的對象。spa
3>永久代:主要保存類信息等內容,這裏的永久代是指對象劃分方式,不是專指1.7的permGen,或者1.8以後的metaspace。對象
根據年輕代與老年代的特色,jvm提供了不一樣的垃圾回收算法。垃圾回收算法按類型能夠分爲引用計數法、複製法和標記清除法。內存
其中引用計數法是經過對象被引用的次數來肯定對象是否被使用,缺點是沒法解決循環引用的問題。虛擬機
複製算法須要from和to兩塊相同大小的內存空間,對象分配時只在from塊中進行,回收時把存活對象複製到to塊中,並清空from塊,而後交換兩塊的分工,即把from塊做爲to塊,把to塊做爲from塊。缺點是內存使用率較低。class
標記清除算法分爲標記對象和清除不在使用的對象兩個階段,標記清除算法的缺點是會產生內存碎片。垃圾回收
jvm中提供的年輕代回收算法Serial、ParNew、Parallel Scavenge都是複製算法,而CMS、G一、zgc都屬於標記清除算法。循環