JVM垃圾回收

前言

JVM程序在运行过程中会不断创建对象,这些对象如果不被回收会一直占用内存,当剩余内存不足以为新对象分配空间时程序将无法运行,因此JVM会在程序运行时会不断地对不再被使用的内存(垃圾)进行回收。而在垃圾回收时会使程序暂停运行(SWT,Stop The World),如果回收的太过频繁会影响程序的执行效率。因此,选择一个合适的垃圾回收机制至关重要。

垃圾的判断

引用计数

在对象中添加一个计数器,当对象被引用时计数器+1,当引用失效时计数器-1,当计数器为0时表示对象没有被引用,可以被回收。

  • 优点:
    原理简单,实现也简单,
  • 缺点:
    难以解决循环引用的情况,比如A引用B,B又引用了A,但A和B 没有被其他对象引用。

可达性分析

通过一系列的称为"GC Root"的对象作为起始点,从这些节点开始向下搜索,搜索所 走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象没有被引用,可以被回收。java中可以被当做GC Root 对象包括:

1. 虚拟机栈中引用的对象
2. 方法区中类静态属性引用的对象
3. 方法区中常量引用的对象
4. Native方法中引用的对象
5. 活动线程中的对象
6. 当前类加载器加载的类的对象

GC Root可达性判断如下图所示:

回收算法

当确定垃圾对象后,就可以使用垃圾回收器进行回收,不同的垃圾回收器所采用的回收算法不同

标记-清除

最基础的回收算法,回收分为两个阶段:标记和清除

  • 回收前

  • 回收后

缺点

  1. 标记和清除的效率都不高
  2. 会产生大量的碎片,导致后续无法分配较大对象

复制算法

复制算法将内存分为大小相等的两块,每次只用一块,当A块用完后,将存活的对象复制到B块,再将A块整体清空。这样不会再出现内存碎片。

  • 回收前:

回收后:

缺点:

  1. 内存缩小为原来的一半
  2. 对象存活率较高时要进行较多的复制操作,效率会变低

标记-整理

标记------整理与标记------清除算法相似,不同点在于在清除过程中将存活的对象想一端移动。这种回收算法适用于对象存活率较高的情况

  • 回收前
  • 回收后

缺点:

在标记清除基础上又添加了对象的移动,效率较低

分代回收

根据对象的存活周期不同,将内存划分为不同的区域。不同的区域使用不同的回收算法。

内存会分为老年代和新生代,新生代中有会分为两个Survivor和一个Eden区,每个Survivor区通常占新生代的10%,Eden占新生代的80%。

  • 对象分配与回收

1. 小对象分配到Eden区
2. Eden空间不足时触发Minor GC,将Survivor1区和Eden区的对象复制到Survivor2区, 下次Minor GC则是将Survivor2区和Eden区的对象复制到Survivor1区
3. 每次MinorGC会对对象年龄进行+1,如果对象年龄大于15则会被分配到老年代
4. 大对象会直接分配到老年代
5. 当老年代无法再分配内存时会触发Major GC

相关推荐
她说彩礼65万4 分钟前
C语言 const的使用
java·服务器·c语言
开开心心就好7 分钟前
视频压缩工具推荐,绿色版免安装双击即用
java·前端·人工智能·spring·智能手机·intellij-idea·excel
Wang's Blog10 分钟前
Java框架 SpringCloud 快速入门: Eureka 注册中心的搭建
java·spring cloud·eureka
专业程序开发源19 分钟前
springboot古城景区管理系统88564-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
泡茶喝茶写代码25 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 7 篇):盈利能力因子:毛利率、净利率与 ROE
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
小蒜学长34 分钟前
基于微信小程序的遇见咖啡店点餐系统设计与实现(代码+数据库+LW)
java·spring boot·后端·微信小程序·咖啡店点餐系统
lisanmengmeng36 分钟前
NRPE 添加命令(三)
java·linux·服务器
Wang's Blog38 分钟前
Java框架 SpringCloud 快速入门: 网关的 CORS 跨域配置
java·开发语言·spring cloud
驭渊的小故事42 分钟前
NC229023 题解:二分答案求解“最大化最小值“问题
java·算法
小蒜学长1 小时前
基于SSM+VUE的电影售票平台的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·ssm框架·电影售票平台