垃圾回收机制(GC)--jvm

本文可能会有过多文字描述:

在1.8后

然后我们经常说的jvm一般指向hotsopt,在实际的商业应用中,会有以下的

在上面的JRockit版本和Hopspot版本,是属于Oracle,并且该公司已经对他们进行了改造合并,所以我们所看见的都是Hotspot,

在其中性能比较高的是Zing,在hotspot上做了优化,低延迟,无暂停,支持的java堆大小可以达到1TB,不过收费

垃圾回收:

在新生代中回收动作叫

面向老年代叫

在magorGC动作发生的时候,通常伴随着的minorGC,所以magorGC也经常叫做full GC或者FGC(全局范围的GC动作)

搜集算法、回收算法:

先确认哪些是垃圾;

引用计数法:

当有一个引用的计,当有一个被引用那么引用计数器就会+1,当观察这个对象的引用计算器大于0的时候,那么这个对象就不会被回收

相反:

如果为0那么就表示没有人使用,那么将被回收。

缺点:

导致计数器不会为0;

可达性分析算法:

通俗来说;   从堆内存的根对象出发 。就是看能不能到达,被连接着对象,不能到达就算被回收

回收算法:

标记清除算法:

 

当垃圾回收器将扫码进行标记成垃圾对象,然后进行回收

缺点:

在运行过程中会造成好多碎片,让内存使用率降低,(一些公司维护的时候就重新启动一下服务器)

复制算法:

当前面内存不够的时候就会复制一份,然后将前面内存清空,然后对回收东西进行处理

缺点:

会造成内存的废用,之前堆区中的两个幸存去就是实现这个算法

标记整理算法:

在清理垃圾的同时进行碎片整理工作,一般会在老年代空间不足的时候会触发一次FullGC,这个时候会进行碎片整理工作

jvm中具体的垃圾回收器:

Serial:(单线程)

属于新生带的垃圾处理器,有个搭档,负责老年代的垃圾回收,SSerial Old

会进行一边生成垃圾,一边标记垃圾,会造成错标,漏标的问题

错标如何产生:

所以就有了重新标记:

会用多线程的方式,重新修正错误的标记,然后用并发清理垃圾。

因为线程运行,新产生垃圾不能被及时清理,叫浮动垃圾,只能等待下一轮

G1垃圾回收器;

他没有搭档,一个人就能搞内存,允许用户手动设置一个期望的STW时间,但无法精准,只会努力靠近

运行过程:

将整个堆内存划分为若干相等大小的区域,数量为2048.  保留了幸存区,老年代,伊瑟区概念。不过表示物理上的连续空间。

一个东西被年轻代使用,属于年轻代,被垃圾清理后,被老年代占用,就属于老年代。他们空间大小不被绝对固定,当

GC扫描内存的时候,直接扫描一个区域

提高了内存使用率,G1的设计原本针对大内存使用,在其中会有大量空间换时间的算法细节。

当G1内存回收时,设定了STW时间来调整策略,会将扫描的地方进行价值排序

因为区域垃圾数量不同,回收时间也不一样,如果设定50ms

会尽量靠近,进行处理。

但是如果设置过低,处理一部分后会有大量垃圾区域没有清理,导致GC触发频率频繁

在区域里采用了复制算法,进行碎片整理

例子:

几个区域需要回收,采用复制算法·直接将存货的对象赋值刀新区域内,避免产生碎片。

会把大对象单独放。

之前说如果过大会进老年代,现在依然属于,只是储存独立,回收前,内存的位置固定不变,避免老年代做垃圾回收整理时,频繁移动大对象

就是自己设置停顿时间,而且将新生代老年带划分为2048个碎块,同时使用标记移除整理和复制算法来回收呗

三色标记算法:

如何使用:

打开cmd

输入

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值