什么是GC垃圾?

一.何为垃圾?

所谓垃圾对象,指在JVM内存不可以被再次使用的对象,这种对象没有了引用,我们在代码层面已经不能够再次调用到它;
常见如匿名对象 new Object();该对象只是在这一条语句中起了作用,之后我们再也引用不到它,但是它仍占用着JVM的内存空间。
那么如何判定一个对象到底是不是垃圾,常见的有2中标记算法:
1.引用计数法:
意为在每一个对象创建的时候,给它设置一个引用计数器,该对象每有一次引用,则让它的计数器+1;若该对象的计数器为0则毫无疑问就是垃圾。
缺点:
如A,B两个对象存在循环依赖,相互引用,则A,B对象的计数器必不为一;它们就不会被标记为对象,但实际上它们已经无法和外界相连,我们也无法通过Java代码去操作A,B对象;它们已经是垃圾了。
2.可达性分析:GCRoot
该算法是选择1个非垃圾的对象作为一个根节点GCRoot,通过相互依赖引用的关系一直向下追朔,所有关联到的对象共同组成一个引用链,该引用链上的对象都是存在或多或少的引用,都是非垃圾对象;而不在该链上的对象则不可达,它们或许存在相互的引用,但是它们已成成为了垃圾。
什么是GCRoot?
一定是非垃圾对象,可以是虚拟机栈中临时变量指向的对象,可以是本机方法栈中指向的对象,可以是方法区常量池中指向的对象,也可以是方法区类的静态属性指向的对象。

二.垃圾回收算法

1.标记–清除算法
对垃圾(或非垃圾,若标记非垃圾则未标记的就是垃圾)进行标记,然后对整个内存空间进行遍历,找到标记的垃圾对象进行清除。
缺点:
直接清除却不做后续处理,会导致内存空间存在大量的内存碎片,零零散散的内存碎片导致空间利用率大打折扣,甚至有些大对象直接无法继续存储。
2.标记–复制算法:
将整个内存空间平均划分,分为A,B两个相同的部分,每次只使用其中之一,在进行垃圾回收时,将非垃圾对象全部从A移动到B(或从B到A),然后对原空间进行全部删除。
缺点:
整个内存空间只用一半在使用,空间利用率只用0.5,这样会导致存储量大大减少;而且在垃圾复制时,对非垃圾对象进行移动也是一个很耗性能的操作
3.标记–整理算法:
是清除算法和复制算法结合;在清除算法的基础上,对后续的内存进行整理,把剩余的非垃圾对象都移动到空间的一侧,然后对剩余的空间进行整理,清理掉所谓的内存碎片,提高内存利用率。

三.STW

1.什么是STW?
STW即Stop The World,指在进行垃圾回收的时候,虚拟机会主动停止所用的Java线程,只留GC线程工作,待GC完成后从新启动用户线程;
2.为什么要STW?
STW是一个Java服务最不想遇到场景,他会暂停一切用户服务,导致Java服务暂时性的不可用,若是在大型的分布式系统中,这觉得是一个不可容忍的行为;但是STW也是为了GC回收的安全性,虽然GC线程只是一个守护线程,但是若是让GC与用户线程同时运行,则必然可能存在垃圾标记的时候,用户线程new了一个新对象,但是尚未指向,此时GC线程把这个新new的对象标记成了垃圾,然后进行回收;则这种情况就是一种潜在的Bug。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值