JVM基础知识(四)- 分代回收机制和垃圾回收算法

本文深入探讨了Java的JVM分代回收机制,解释了新生代和老年代的概念,以及如何通过不同的垃圾回收算法如复制、标记清除、标记整理等提高效率。此外,介绍了几种常见的垃圾回收器,如Serial、Parallel、CMS和G1,分析了它们的优缺点及适用场景,强调了GC对性能的影响和STW现象。
摘要由CSDN通过智能技术生成

这次我们来讲讲垃圾回收,前边或多或少的都提及过垃圾回收的知识点,我们经常说的GC(Garbage Collection)就是垃圾回收,我们都知道JAVA都是由C++演化而来,那么JAVA和C++很重要的一点不同就是自动分配内存和自动回收内存,这两块已经不需要JAVA开发者来操心。但是GC对性能是有影响的,有时候会暂停所有的线程,触发STW(Stop the world),所以GC是把双刃剑。那么一般情况下,垃圾回收的重点是在堆区,栈区是随线程的消亡而消亡的,不需要垃圾回收器去管理,方法区虽说可以进行垃圾回收,但是效率太低,基本也不用考虑。

分代回收理论

分代回收主要说的是堆区,这个理论大体可以这么理解:绝大多数的对象是朝生夕死的,且经过多次垃圾回收还存活的对象会越来越难以回收,是一个长期存活的对象。所以基于以上两点,我们就把朝生夕死的对象放在一个区域--新生代,多次垃圾回收之后还坚挺的对象放在另外一个区域--老年代。

依据此图,我们来看一下堆区的分代划分:

新生代:分为Eden区以及两个survival 区--From区和to区,默认的情况下它们的内存大小比例是8:1:1,也就是说如果新生代分配了100M空间,Eden区大小是80M,From区和to区各10M。

老年代:是一个整块区域Tenured区,新生代和老年代的内存比例默认是1:2,也就是如果堆空间是300M,那么新生代是100M,老年代是200M。

所谓的分代回收指的就是对不同代的内存空间使用不同的垃圾回收器进行垃圾回收,对新生代进行回收我们一般叫MinorGC/YoungGC,对老年代回收我们一般叫做MajorGC/OldGC,目前只有CMS 垃圾回收器会有这个单独的回收老年代的行为。FullGC则是回收整个堆区和方法区,而实际上FullGC是调用了不同代所属的垃圾回收器进行回收,方法区使用的是老年代的垃圾回收器。

垃圾回收算法

复制算法(Copying):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。但是要注意:内存移动是必须实打实的移动(复制),所以对应的引用(直接指针)需要调整。复制回收算法适合于新生代,因为大部分对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值