java垃圾回收机制

目录

 

一、何为自动垃圾回收

第一步:标记

第二步:清除&压缩

二、分代垃圾收集

JVM分代

分代垃圾收集过程

1、对象分配&填满eden空间:

2、Minor GC:移动被引用的对象&对象增龄&对象持续增龄

3、Major GC:新生代晋升到年老代:


一、何为自动垃圾回收

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用总的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

Java通过垃圾回收器负责自动分配和释放内存,下面介绍一下垃圾回收机制的基本过程。

第一步:标记

垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。

其中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步会相当耗时间。

第二步:清除&压缩

清除:删掉标记出的未引用对象。内存分配器会保留指向可用内存的引用,以供分配新对象。

压缩:为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。

二、分代垃圾收集

根据统计,大部分的对象,其实用没多久就不用了。

(下图中,竖轴代表存活中的对象,而横轴代表程序运行时间)

上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。

JVM分代

根据之前的规律,就可以用来提升JVM的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老生代,以及永生代。

新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。

Stop the World事件——小型垃圾回收属于一种叫“Stop the World”的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。

老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为Major GC。

Major GC也会触发STW(Stop the World)。通常,Major GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major的STW的时长受年老代垃圾回收器类型的影响。

永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外JavaSE类库和方法也存储在这里。

如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。

分代垃圾收集过程

现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用。后面的图片将介绍JVM中的对象分配和老化过程。

1、对象分配&填满eden空间:

将任何对象分配给eden空间。两个servivor空间都是空的。

2、Minor GC:移动被引用的对象&对象增龄&对象持续增龄

当eden空间填满时,会触发小型垃圾回收(Minor GC)。引用的对象被移动到第一个survivor区(S0)。清除eden空间时,将删除未引用的对象。

在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们先被移动到第二个Survivor区(S1)。此外,第一个Survivor区(S0)中,在上一次MinorGC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0.幸存的对象增加年龄。Eden区和S1被清空。

3、Major GC:新生代晋升到年老代:

在较小的GC之后,当老化的物体达到一定的年龄阈值时,它们从年轻一代晋升到老一代。随着较少的GC持续发生,物体将继续被推广到老一代空间。这个过程涵盖了新生代的整个过程。最终,将主要对年老代进行GC,清理并最终压缩该空间。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值