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

作者:亭中独酌 时间:2022-02-28 16:51:56 

一、前言:

垃圾回收:

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

先问自己几个问题:

什么是垃圾?

  • 垃圾就是堆内存中(范指)没有任何指针指向的对象实体。不具有可达性。

为什么要回收垃圾?

  • 因为我们的内存是有限的,内存长时间不清理就会导致内存溢出,OOM;

  • 只要是程序正在跑,那么就不断生成新的对象,我们需要GC开辟新的空间分配给新的对象

我们怎么回收垃圾?

  • 依靠Java的自动内存回收机制,机制的优劣由算法决定;

  • 或者说是机制的适配度由算法和应用场景共同决定。

什么时候回收垃圾?

  • 当堆中的实体对象没有任何指针指向的时候

二、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调用的

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

  • 可触及:正常状态,在GC Roots的引用链上;

  • 可复活:需要重写finalize方法才有的,“皇帝赐给你的重写finalize方法”

  • 不可触及:finalize免死金牌只能用一次,如果没有重写的finalize方法,那么就直接挂了。

MAT & GC Roots:

Memory Analyzer Tools 内存分析工具

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

分区算法

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

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

String

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

Serializable修饰是跨进程

Comparable可比较的

来源:https://blog.csdn.net/weixin_43801418/article/details/117932532

标签:JVM,垃圾回收
0
投稿

猜你喜欢

  • C#超市收银系统设计

    2023-06-21 00:00:09
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    2023-07-05 06:54:14
  • AndroidStudio插件GsonFormat之Json快速转换JavaBean教程

    2021-10-10 12:48:05
  • IDEA设置maven修改settings.xml配置文件无法加载仓库的解决方案

    2023-08-23 22:39:35
  • Android使用注解代替枚举节省系统内存开销的方法

    2021-09-28 18:46:06
  • Servlet实现文件的上传与下载

    2023-08-08 06:13:43
  • Java泛型之类型擦除实例详解

    2022-02-13 06:39:36
  • Java设计模式之接口隔离原则精解

    2022-05-05 16:42:05
  • Java中的synchronized 优化方法之锁膨胀机制

    2023-10-02 03:44:15
  • Android 实现图片生成卷角和圆角缩略图的方法

    2021-08-12 16:14:12
  • JAVA提高第八篇 动态代理技术

    2023-07-19 07:13:12
  • 如何使用Java给您的图片瘦身之Thumbnailator技术

    2023-10-31 10:25:52
  • 如何解决修改StaticText的字体

    2023-05-25 08:40:14
  • 详解如何在Android studio中更新sdk版本和build-tools版本

    2023-11-18 04:36:15
  • Android-实现切换Fragment页功能的实现代码

    2023-05-06 12:28:49
  • 详解Java的MyBatis框架与Spring框架整合中的映射器注入

    2021-06-02 00:32:31
  • 详解C#设置Excel数据自适应行高、列宽的2种情况

    2022-10-21 23:46:29
  • Android app启动时黑屏或者白屏的原因及解决办法

    2023-06-09 11:32:32
  • java LockSupport实现原理示例解析

    2023-05-14 06:43:05
  • Java多线程编程中使用Condition类操作锁的方法详解

    2023-10-19 13:30:55
  • asp之家 软件编程 m.aspxhome.com