java gc收集器类别_强烈推荐:精讲解析Java垃圾回收GC

原标题:强烈推荐:精讲解析Java垃圾回收GC

了解java的就会知道Java有一大特性就是内存的分配和回收都是自动进行的。当程序规模不大的时候,我们可以完全不去考虑内存的使用情况。但是如果程序的规模足够大,对性能的要求足够高的时候,明白Java垃圾收集(GC)的内部机制并根据具体的应用特征来调整使用的垃圾收集算法就显得十分重要了。

1、垃圾收集GC属性

ac1192cc736ca60f6eb6186b52d26f3b.png

2、影响垃圾收集GC的因素

765675647f9ce810a73f42ef0c43a181.png

3、Java的引用类型

599dd11658768fe8e1b131f325ad93f9.png

上述四种引用的强度由上至下依次减弱。可以看出,除了强引用,其他引用对于GC的执行并无太大的影响。

4、垃圾收集器

不同的虚拟机中通常有不止一种的垃圾收集器,它们实现了不同的垃圾收集算法。

5、分代回收(Generational)

每一次GC运行都需要对堆中所有的对象进行遍历。因此,随着堆中对象数量的增多,GC的效率就会随之下降。于是,GC将堆中的对象按照存活时间分为三代:Young(新生代)、Old(老年代)、Perm(永久代)。

YOUNG 新生代

141fbb2adced992d37643952c0e29f1f.png

由图可见,新生代又可划分为三个区域:Eden,Survivor0,Survivor1。其中,Eden区最大,新对象的内存分配都在此区域进行。两个Survivor区域一个为From区,一个为To区,每次只使用其中的一个。

新生代的垃圾回收采用的是复制算法。第一次GC时,Eden区的存活对象会被复制到S0区。此后每次进行GC时,Eden区和From区的存活对象都会被复制到To区。如果一个对象在经历了几次垃圾回收后仍然存活,那么它就会被复制到Old Generation(老年代),此过程称为Promotion。

OLD 老年代

老年代的对象是由新生代对象经过Promotion而来,该区域的对象存活率普遍较高,因此一般采用Mark-Sweep或Mark-Compact算法。

PERM 永久代

永久代并不用来存储从老年代经过Promotion而来的对象,它存储的是元数据,包括已被虚拟机加载的类信息、常量、静态变量、方法等。该区域通常不会发生垃圾回收。

6、GC监控

在实际应用中,常常需要根据不同的应用特征调整垃圾收集器的配置方案。在调整过程中,不免需要监控各种收集器的运行过程来进行性能的比较。JDK自带了一个Visual VM工具来可视化GC的执行过程。不同收集器生成的日志格式可能不尽相同,但都有一定的共性。下面列出的是在实际应用中使用ParNew+CMS和使用G1时产生的日志,从中可以很清楚的看到CMS和G1的执行阶段以及GC运行时用户线程暂停的时间。

ParNew+CMS日志

0159ac0d558f639e8f860a146e4b2128.png

G1日志

7a2ddee67f1127ac999653db71bbef5f.png

在这里我们还需要去主注意的是要避免显式调用System.gc()或Runtime.getRuntime().gc()。这两个方法只是给虚拟机的一个建议,是否执行垃圾回收还是由虚拟机来决定。也不要在finalize()方法中释放资源。不要尝试在finalize()方法中逃脱垃圾回收。

大家可以jia抠qun八六零170四一六获取学习视频资料

为了帮助大家学习和理解掌握,我也有免费的视频教程教大家如何快速简单的去学习,也有专门的裙供大家在里面分享在学习和工作中的问题,里面会有大佬帮忙解答。

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值