1.产生的过程
对象被jvm垃圾回收,随着对象熬过垃圾收集过程的次数(这里叫为对象的年龄)
依据回收对象的年龄将对象分配到不同的java堆区域;
1.弱分代假说: 认为大多数对象都是朝生夕死 --> 年轻代
2.强分代假说: 对象年龄越大越难被回收 ---> 老年代
3.跨代引用假说: 存在年轻代与老年代相互循环引用,应该倾向于同时生存与同时消亡
跨代引用的具体操作:
1.在年轻代上建立一个全局数据结构 (记忆集 remembered set)
2.数据结构把老年代划分为若干小块,标出哪一块内存会存在跨代引用
3.Minor Gc时, 将包含了跨代引用的小块内存计入到GC Roots进行扫描
备注: 部分扫描总是优于全局扫描
2.java堆区域的划分
年轻代:(Young Gen)
大小:
随堆大小的增大和减小而相应的变化,默认值是保持为堆大小的1/15
-Xmn 参数设置年轻代为固定大小
-XX:NewRatio 来设置年轻代与年老代的大小比例
特点:
年轻代用来存放新近创建的对象
产生大量的死亡对象,并且要是产生连续可用的空间
使用标记-复制,标记-清除 算法和并行收集器进行垃圾回收
对年轻代的垃圾回收称作初级回收 (minor gc)
区域划分:
一个新生代 Eden
2个大小相同的复活代 S0 S1
回收过程:
1.应用程序只能使用一个新生代和一个复活代,
2.当发生初级垃圾回收的时候,gc挂起程序,
3.然后将新生代和复活代中的存活对象复制到另外一个非活动的复活代中,
4.然后一次性清除新生代和复活代,将原来的非复活代标记成为活动复活代。
5.将在指定次数回收后仍然存在的对象移动到老年代中,
6.初级回收后,得到一个空的可用的新生代。
具体描述:
1.对象在 Eden 出生后,在经过一次 Minor GC 后
2.如果对象还存活,并且能够被另外一块 Survivor(S0) 区域所容纳,
则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor(S1) 区域中,
3.然后清理所使用过的 Eden 以及 Survivor(S0+S1) 区域,并且将这些对象的年龄设置为1
4.以后对象在 Survivor(S1) 区每熬过一次 Minor GC,就将对象的年龄 + 1,
5.当对象的年龄达到某个值时 ( 默认是15岁,-XX:MaxTenuringThreshold 来设定 ),
这些对象就会成为老年代,对于一些较大的对象 (即需要分配一块较大的连续内存空间),
则是直接进入到老年代。
老年代:(Old Memory)
标记-清除算法
永久代: (Perm) 这jdk8后被移除修正为 <元空间>
方法区
永久代与元空间的区别:
永久代是和堆相联的一块物理内存
元空间是和堆内存不相关的一块独立的内存空间
3.垃圾回收名词分类
Partial GC 收集java堆部分垃圾,是区别于完整收集而定义的,可以细分
Minor GC 新生代收集 (次要的)
Major GC 老年代收集 (主要的)
Mixed GC 混合收集 (GI收集器才会有这种行为)
Full GC : 收集整个java堆和方法区的垃圾 (发生在老年代的垃圾收集动作)
4.垃圾回收算法
标记-清除
标记-复制
标记-整理