04-JVM-垃圾回收

本文探讨了垃圾回收的必要性、重点区域,介绍了垃圾回收算法如标记清除、复制和压缩,剖析了内存泄漏案例,包括静态集合类、单例模式和缓存泄漏。讲解了可达性分析算法、System.gc()和finalize()的作用,以及垃圾回收的并行与并发。此外,还涵盖了弱引用、软引用和虚引用等五种引用的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

在这里插入图片描述

什么是垃圾?

在运行程序中没有任何指针指向的对象称为垃圾,若不及时回收则该对象会一直占用内存直到程序结束

为什么需要垃圾回收

在这里插入图片描述
在这里插入图片描述

垃圾回收的重点区域

在这里插入图片描述

二、垃圾回收算法

在这里插入图片描述
在这里插入图片描述

三、内存泄漏

如果堆中出现无法回收的垃圾,那么就称为内存泄漏
在这里插入图片描述

内存泄漏的例子

  1. 静态集合类
    在这里插入图片描述
  2. 单例模式:当单例对象持有外部引用时,会导致该外部引用对象一直存活直到程序结束
  3. 内部类持有外部类
  4. 各种资源连接每及时执行close
  5. 缓存泄漏:使用缓存存储数据时时间一长就会有大量无用的对象在缓存中,导致大量无用的元素保存在内存中

四、可达性分析算法

标记GC Roots直接或间接引用的对象,它们不是垃圾

特点:实现简单、执行高效,防止内存泄漏

GC Root

面试题
在这里插入图片描述

在这里插入图片描述

垃圾回收算法

在这里插入图片描述

标记清除算法

根据可达性分析标记存活对象,没有被标记的对象所占的内存可以被新对象覆盖

特点:速度还行但是内存碎片多

标记复制算法

根据可达性分析标记存活对象,将存活对象复制到另一片空白的区域,并将原先区域的所有对象进行清除

特点:速度快而且不产生内存碎片,但是需要额外的空间进行复制操作

标记压缩算法

根据可达性分析标记存活对象,将存活对象进行压缩,使其占用一块连续的内存

特点“:速度慢但是没有内存碎片也不需要额外的内存空间

增量回收算法

垃圾收集线程每次只回收一块小内存,接着切换到程序线程,依次反复直到垃圾回收完成,典型的有G1的垃圾回收机制

特点:提高了响应速度但降低了吞吐量

五、System.gc()和finalize()

System.gc()

提醒垃圾回收器去执行Full GC,但不会立即执行

finalize()

当一个对象首次被当成垃圾时,再回收之前执行finalize()方法,可以在finalize()方法中被其它存活对象引用完成"复活"

作用:在该对象销毁前,对某些资源进行释放,像Socket、IO资源等

六、垃圾回收的并行与并发

  • 并行:多条垃圾回收线程同时进行垃圾回收
  • 串行:单条垃圾回收线程同时进行垃圾回收
  • 并发:用户线程和垃圾回收线程同时进行

七、安全点

在这里插入图片描述

八、五种引用

面试题

在这里插入图片描述
weakHashMap
用来存储一些不太重要的缓存,它使用弱引用来关联数据,垃圾回收时,弱引用是一经发现直接回收的,不会因为缓存太大导致OOM

软引用

在这里插入图片描述

弱引用

在这里插入图片描述

虚引用

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值