垃圾回收机制

  垃圾回收机制(GC):垃圾回收中的一个很重要的问题STW(stop the world)问题。触发垃圾回收的时候,很可能回使当前程序的其他的业务逻辑被暂停。垃圾回收,是回收内存:它的主要战场在堆上。

  其实这里的垃圾回收,说是回收内存,更准确的说是“回收对象”,每次垃圾回收的时候,释放的若干个对象。(实际的单位都是对象)

1.识别出垃圾

1.1 引用计数

  这种思想方法,并没有在JVM中使用,但是广泛应用于其他主流语言的垃圾回收机制中。(Python,PHP)

  此时垃圾回收机制:(有专门的扫描线程,去获取到当前每个对象的引用计数的情况)发现对象的引用计数为0,说明这个对象就可以释放了。

1.2 可达性分析(JVM用的是这个)

  本质上使用“时间”换“空间”相比于引用计数,需要消耗更多的额外的时间,但是总体来说,还是可控的,不会产生类似于“循环引用”这样的问题。在代码的过程中,会定义很多的变量。比如,栈上的局部变量/方法区中的静态类型的变量/常量池中引用的对象....就可以从这些变量作为起点,出发,尝试去进行“遍历”,所谓的遍历就是沿着这些变量中持有的引用类型的成员,在进一步的往下进行访问,所有能被访问到的对象,自然就不是垃圾了,剩下的遍历一圈也访问不到的对象,自然就是垃圾。

2. 把标记为垃圾的对象内存进行释放

2.1 标记-清楚

  把标记为垃圾的对象, 直接释放掉。(最朴素的做法)

  此时就是把标记为垃圾的对象对应的内存直接释放,就会产生了上述的内存碎片。它产生了很多小的,但是离散的空闲内存空间,就可能会导致后续申请内存失败。。

2.2 复制算法

    复制算法,核心就是不直接释放内存,而是把不是垃圾的对象,复制到内存的另一半,接下俩就把左侧空间整体释放掉。 

2.3 标记-整理

  也能解决内存碎片问题,类似于 顺序表 删除中间元素,通过这个过程,也能有效解决内存碎片的问题,并且这个过程也不像复制算法一样,需要浪费过多的内存空间,但是这里的搬运内存开销很大。

3. 分代回收(依据不同种类的对象,采取不同的方式)

  引入概念对象的年龄,JVM中专门的线程负责周期性扫描/释放,一个对象,如果被线程扫描了一次,可达了(不是垃圾),年龄就+1(初始年龄相当于是0)。JVM中就会根据对象年龄的差异,把整个堆内存分成俩个大的部分,新生代(年龄小的对象)/老年代(年龄大的对象)。

分代回收过程:

1. 当代码中new 出一个新的对象,这个对象就是被创建在伊甸区。

2. 第一轮GC扫描完成之后,少数伊甸区中幸存的对象,就会通过复制算法,拷贝到生存区后续GC的扫描线程还会持续进行扫描,不仅要伊甸区,也要扫描生存却的对象。生存区中的大部分对象也在扫描中被标记为垃圾,少数存活的,就会继续使用复制算法,拷贝到另一个生存区中。只要这个对象能够在生存区继续存活,就会被复制算法继续拷贝到另一半的生存区中,并且没经历一次GC的扫描,对象的年龄都会+1。

3.如果这个对象在生存区中,经过了若干轮GC任然存在健在,JVM就会认为,这个对象生命周期大概率很长,就把这个对象从生存区,拷贝到老年区。

4. 老年代的对象,当然也要被GC扫描,但是扫描的频次就会大大降低了。

5.对象在老年代寿终正寝,此时JVM就会按照标记整理的方式,释放内存。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的垃圾回收机制是Java语言的一项重要特性,它可以自动管理内存,减轻了程序员手动释放内存的负担。Java的垃圾回收机制主要通过垃圾收集器(Garbage Collector)来实现。 在Java中,当一个对象不再被引用时,就可以被判定为垃圾垃圾收集器会定期扫描堆内存,找出不再被引用的对象,并将其回收释放内存空间。这样,程序员就不需要手动释放对象所占用的内存,大大简化了内存管理的工作。 Java的垃圾回收机制基于以下两个核心概念: 1. 引用计数法:每个对象都有一个引用计数器,当有新的引用指向该对象时,计数器加1;当引用失效时,计数器减1。当计数器为0时,表示该对象不再被引用,可以被回收。但是,引用计数法无法解决循环引用的问题,即两个或多个对象相互引用,但与程序的根节点没有直接引用关系,导致无法被回收。 2. 可达性分析算法:Java的垃圾回收机制采用可达性分析算法来判断对象是否可被回收。该算法从程序的根节点(如静态变量、方法参数等)出发,通过引用链追踪对象的引用关系,如果一个对象不可达(即无法通过引用链与根节点相连),则被判定为垃圾,可以被回收。 Java的垃圾回收机制具有以下优点: 1. 简化了内存管理,减少了内存泄漏和野指针等问题的发生。 2. 提高了程序的可靠性和稳定性,减少了因为内存管理错误导致的程序崩溃。 3. 提高了开发效率,程序员不需要手动释放内存,可以更专注于业务逻辑的实现。 然而,垃圾回收机制也存在一些缺点: 1. 垃圾回收过程会占用一定的系统资源,可能会导致程序的运行速度变慢。 2. 垃圾回收的时间是不确定的,可能会导致程序在某些时刻出现短暂的停顿。 相关问题: 1. Java的垃圾回收机制是如何工作的? 2. 什么是引用计数法?它有什么缺点? 3. 什么是可达性分析算法?它如何判断对象是否可被回收? 4. 垃圾回收机制有哪些优点和缺点?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值