Java虚拟机GC垃圾回收机制(简单入门)

Java虚拟机GC垃圾回收机制

堆:运行时数据区(GC主要在这里进行)

所有对象和数组都被存放在这里,也是GC垃圾回收最重要的内存区域

GC类型

GC有两种类型:
1:minor GC面向新生代的垃圾回收机制,使用复制算法:
先复制并转移对象,然后清空,该算法效率高运算频繁
2:majorGC面向老生代的垃圾回收机制,使用标记清除算法:
扫描一遍所有的老生代对象,将仍存活的对象进行标记,然后回收没有标记的对象,该SC消耗很大,尽量不要频繁使用

新生代老生代

Java堆内存空间被分为新生代和老生代,当一个对象被创建时,会在堆中的某一空间进行分配,该空间在被称为新生代(也有很少部分直接创建到老生代,比如对象特别大像长字符串数组)

新生代又被分成三个空间共:

1:8/10的空间被称为eden区,所有创建在新生代的对象都在这里出生,当该区域空间不足的时候,就会触发minorGC进行一次垃圾回收
2:两个1/10的空间被称为ServivorFrom和ServivorTo区,每次垃圾回收时,将eden区和ServivorFrom区内的所有内容进行复制并清空,存入SurvivorTo区中,并将所有对象的年龄加1,默认如果对象的年龄大于15,就将对象移入老生代,最后,将From和To互换,使得下一次GC面向上一次的SurvivorTo

某种情况下可以不用等到对象年龄大于15再进入老生代:
当Servivor区中某一年龄的全部对象的占用空间大于等于整个Servivor空间的一半时,直接将所有大于等于该年龄的对象移入老生代

老生代

老年代存放的都是比较稳定存活的对象,有两种情况会触发垃圾回收MajorGC
1:当新生代minorGC结束,往老生代放数据时发现空间不够后
2:当存入大对象发现没有连续的空间能够存放后

怎样判断对象存活还是死亡

当一个对象没有被任何对象引用时,说明该对象时不可达的

注意,不可达不代表需要回收,只有经过至少两次的标记过程之后,该对象仍是不可达对象,才会面临回收,GC Roots对象作为起始点,一直向下搜索会形成一个引用链,如果某个对象不在引用链中,说明是不可达的

如何判断该对象有没有被引用

引用计数法:每个对象都有一个引用计数属性,操作对象必定会进行引用,每添加一个引用就引用计数加一,释放一个引用则引用计数减一,这样如果某个对象的引用计数为零,说明可以被回收
但是该方法有一个问题:两个对象之间互相引用,这样引用计数永远不可能为0,叫做循环引用问题

如何解决循环引用问题

Java使用一系列的GC Roots对象作为起始点,一直向下搜索会形成一个引用链,如果某个对象不在引用链中,说明是不可达的

注意,不可达不代表需要回收,只有经过至少两次的标记过程之后,该对象仍是不可达对象,才会面临回收

Java的四种引用类型

强引用

只要能被GC Roots引用链引用到,即可达,就属于强引用,永远不会被垃圾回收

软引用

软引用的对象只有在内存空间不足的情况下才会被回收

弱引用

弱引用的对象只要被GC发现就会被回收,即只能存活最多一个GC周期

虚引用

虚引用不能单独使用,该引用的唯一目的就是能在这个对象被收集器回收时,收到一个系统通知,也即跟踪对象被垃圾回收的状态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值