本文可能会有过多文字描述:
在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
输入