jvm之垃圾回收小结

回收算法

java虚拟机采用可达性分析来探索所有的存活对象。
从一系列GCRoots出发,边标记边探索所有被引用的对象。

常见的根节点

1.类加载器
2.Thread
3.虚拟机栈的本地变量表
4.static静态成员
5.常量引用
6.本地方法栈的引用

为了防止在标记过程中堆栈的状态发生改变,java虚拟机采用安全点机制来实现Stop-the-world操作,暂停其他非垃圾回收线程。

回收死亡对象的内存有三种方式
①清除:会造成内存碎片(java虚拟机的堆中对象必须是连续分布的,因此可能出现总空闲内存足够,但无法分配的极端情况),同时也会造成分配效率低下。对于空闲列表,java虚拟机需要逐个访问列表中的项,来查找能够放入新建对象的空闲内存。

②压缩:性能开销会过大。会把存活对象聚集到内存区域的起始位置,从而留下一段连续的内存区域。

③复制:堆使用效率相对低下。把内存区域分为两等分,分别用两个指针from和to来维护,并且只是用from指针指向的内存区域来分配内存,发生垃圾回收时,会把存活的对象复制到to指针指向的内存区域中,并且交换from和to指针的内容。


15854876-5424435c4f264629.png
image.png

几个点

①大部分对象都只是存活一小段时间,小部分对象存活一大段时间。即二八法则
②基于①的假设,采用了分代回收的算法
③堆内空间=年轻代+老年代
年轻代=Eden+from+to
年轻代适合分配新生的对象
Eden-通常用于存储新创建的对象,对内存空间是共享的,所以,直接在这里面划分空间需要进行同步。

from-当Eden区的空间耗尽时,jvm会触发一次Minor GC 来收集新生代的垃圾,会把存活下来的对象放入Survivor区,也即from区

备注:from区和to区是变动的

to-指向的Survivor区是空的,用于当发生Minor GC时,存储Eden和from区中的存活对象,然后在交换from和to指针,以保证下一次Minor GC时to指向的Survivor区还是空的。

老年代-用于存储存活时间更久的对象。
比如:15次Minor GC还存活的对象将被放入老年代(为什么是15次?HotSpot会在对象头的标记字段里记录年龄,分配到的空间只有4位,最多2^4=16所以最多只能记录到15)

④堆内存分配后,会根据它们的不同特点来进行区分对待,采用不同的垃圾回收方式。
针对新生代的垃圾回收器有三个(采用的标记-复制算法)
Serial 单线程
Paralle Scavenge 多线程
Parallel New

针对老年代的垃圾回收器有三个(采用的标记-压缩算法)
Serial Old
Paralle Old
CMS

⑤TLAB(Thread Local Allocation Buffer)
Java中每个线程都会有自己的缓冲区称作TLAB(Thread-local allocation buffer),每个TLAB都只有一个线程可以操作,TLAB结合bump-the-pointer技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。

Java对象分配的过程
编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在堆上分配,则进入选项2.
如果tlab_top + size <= tlab_end,则在在TLAB上直接分配对象并增加tlab_top 的值,如果现有的TLAB不足以存放当前对象则3.
重新申请一个TLAB,并再次尝试存放当前对象。如果放不下,则4.
在Eden区加锁(这个区是多线程共享的),如果eden_top + size <= eden_end则将对象存放在Eden区,增加eden_top 的值,如果Eden区不足以存放,则5.
执行一次Young GC(minor collection)。
经过Young GC之后,如果Eden区任然不足以存放当前对象,则直接分配到老年代。

⑥卡表
这个技术是为了处理Minor Gc时老年代对新生代的引用,为了避免整堆扫描。
备注:通过GC_roots探索存活对象的时候,有的对象在新生代,有的对象在老年代。如果当前对象处在老年代且在脏卡中,则需要继续深度遍历对象。若不在脏卡中,就没有必要进一步深度遍历下去了。

几种收集器

15854876-cd935c58d325995a.jpg
Serial收集器.jpg
15854876-3b246f05d9ad5ead.jpg
ParNew收集器.jpg
15854876-e9a59c2ecef1adbe.jpg
cms收集器.jpg
15854876-0a14fcb3a9274569.png
g1收集器.png

关于它们的使用

15854876-c35f06eec3a01d1e.png
收集器配合图.png

猜你喜欢

转载自blog.csdn.net/weixin_34310785/article/details/87165503