GC垃圾回收机制

垃圾回收java虚拟机(JVM)自动管理内存的一项重要功能。他通过自动检测和回收不再使用的对象,释放内存空间,以避免内存泄露和提高应用程序的性能。

查找垃圾的算法

1.引用计数法:

给每一个对象设置一个引用计数器,当有一个地方引用这个对象的时候,引用计算器就+1,引用失效时,引用计数器就-1,:当引用计算器为0的时候,就说明这个对象没有被引用,也就是垃圾对象,等待回收:

缺点:无法解决循环引用的问题,当A引用B,B也引用A的时候,这时候AB对象都不为0,也就无法进行垃圾回收,所以一般的主流虚拟机都不采用这个方法。

2.可达性分析法:

从一个被称为GC Roots的对象向下搜索,如果一个对象到GC Roots没有任何引用链相连接时。说明此对象不可用,在java中可以作为GC Roots的对象有以下几种:(主要在JVM内存区域中的方法区和栈区)

1.虚拟机栈中引用的对象

2.方法区类静态属性引用的变量

3.方法区常量池引用的对象

4.本地方法栈JNI引用的对象

回收垃圾的算法

1.标记-清除算法

分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。

这种算法的缺点是会产生比较多的内存碎片,系统运行时间长了以后,无法再大量分配连续的内存空间,会导致更加频繁的GC。

2.标记-复制算法

简称为复制算法。为了解决标记-清除算法面对大量可回收对象时的效率问题

它将用内存按容量划分为大小相等的两块,每次只使用其中的一块。

当这一块的内存用完了,就将还活着的对象复制到另一块上面,然后再把已使用过的内存空间一次处理掉。这种算法的优点是可以避免内存碎片问题,但是实际上使用的内存空间只有一半,比较浪费内存空间。

3.标记-整理算法

是针对老年代对象的存亡特征提出的一直算法,其中的标记过程仍然与“标记-清除”一样

但后续步骤不是直接对可回收对象进行清理。而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

这种算法的优点是可以避免内存碎片问题,但是需要移动存货对象,而且这种对象移动操作必须全程暂停用户应用程序才能进行,所以耗时时间较长。

分代

分为三个代,分别为新生代 老年代 永久代 其中新生代包括:Eden区 Survivor(瑟歪窝)区(Survivor包含From和To区)

一般的垃圾回收发生在堆区,很少有在方法区发生,所以方法区被称为永久代

新生代

包括Eden,From Survivor,To Survivor三个区

这个区采用的是复制收集算法,即:

1.现将Eden、from survivor中存活的对象复制到 to survivor区中

2.清空Eden、from survivor两个区

3.最后将to survivor区中的对象复制到from survivor区中,并清空to survivor区

从新生代到老年代

大对象直接进入老年代

新生代survivor中年龄达到15的对象,移入老年代

为survivor区作担保,其内存已满而不能存储的对象在老年代中

老年代

老年代因为对象的存活率高(复制的对象就要高),也没有担保空间,所以采用标记清除/整理法

CMS收集

1.stop this world 初步标记(初步标记GCRoot直接关联的对象)

2.并发标记(进行GCRoots跟踪过程)

3.stop this world重新标记(修正在2阶段产生的垃圾)

4.并发清除

优点:可以知道大量的标记和清除都在并发阶段执行,所以其垃圾收集停顿时间极短,可以提高用户的交互体验。

为什么要分代收集?

可以知道很多对象都是朝生夕死的,那么新生代就起到了一个缓存一样的作用,集中的处理新垃圾,而存活率高的对象则放在老年代,使垃圾收集的代价降低了

Minor GC和Full GC

新生代快满了的时候就会触发Minor GC,Minor GC是比较频繁的GC,一般耗时较少。

老年代快满了或者System.gc()建议,则会触发Full GC,Full GC会对整个堆进行GC,甚至包含几次Minor GC,所以耗时较长

永久代

主程序运行时似乎不会对永久代进行回收?

在JDK1.8中,为了防止方法区溢出,将方法区改为元数据区,将其放到堆外内存(本地内存)中去了,那么他的大小就不受JVM的限制了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值