java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JVM垃圾回收算法

浅谈JVM垃圾回收有哪些常用算法

作者:亭中独酌

今天给大家带来的是关于Java虚拟机的相关知识,文章围绕着JVM垃圾回收有哪些常用算法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

一、前言:

垃圾回收:

在未来的JDK中可能G1会为ZGC所取代

先问自己几个问题:

什么是垃圾?

为什么要回收垃圾?

我们怎么回收垃圾?

什么时候回收垃圾?

二、GC的标记阶段算法:

标记&清除

1、引用计数(Reference Counting):

Java已经摈弃了这种算法,因为此算法需要的额外处理过多

【优】效率高,python也在用,就像论文的引用因子一样,没有用的文章就应该多多回收,清理学术垃圾。

【缺】无法处理对象的相互“循环引用”,一旦形成了引用环,就没有办法去解决。进而造成内存泄漏。

2、可达性分析⭐(根搜索、Tracing Garage Collection):

GC Roots = 起始节点集,从GC Roots开始向下搜索,连接的路径为引用链,GC Roots不可达的对象被判为不可用。

哪些是GC Roots?

【优】解决了循环引用的缺点

【缺】需要遍历

三、垃圾收集算法:

标记清除算法
复制算法
标记清除整理算法

标记-清除算法:

先mark可达对象,从根节点开始进行线性遍历

【优】够平均

【缺】效率不高,GC的时候导致STW,清楚后存在内存碎片(会存在一个空闲列表)

这是最快的清除算法

复制算法

先把空间分为两个部分,把标记的对象规整地移到另一个空间中(指针碰撞的方式)

【优】高效,无需mark/sweep;没有内存碎片;

【缺】牺牲了大量的空间,”最好你们全部是垃圾!“

标记-清除-整理算法

在标记之后清除完了再进行整理,属于标记清除算法的优化版,无空闲列表

【优】无空闲列表,无内存碎片;空间开销低

【缺】时间慢,需要进行多次操作。

四、finalize&内存分析工具

finalization——免死金牌

finalize是给GC调用的

【问】回收的时候会涉及到哪些操作?会伴随着什么状态?

MAT & GC Roots:

Memory Analyzer Tools 内存分析工具

分析dump文件:根据GC Roots去溯源,监控内存泄漏→ JProfiler

分区算法

将堆空间分成小空间是为了降低停顿时间,降低延迟

实际的使用都是复合算法。

String

final是写死的,不能继承也不能做任何修改;

Serializable修饰是跨进程

Comparable可比较的

到此这篇关于浅谈JVM垃圾回收有哪些常用算法的文章就介绍到这了,更多相关JVM垃圾回收算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文