【jvm】垃圾判别阶段算法

目录

          • [1. 说明](#1. 说明)
          • [2. 引用计数算法](#2. 引用计数算法)
          • [2. 可达性分析算法](#2. 可达性分析算法)
          • [3. 垃圾判别阶段的过程](#3. 垃圾判别阶段的过程)
1. 说明
  • 1.JVM主要使用两种垃圾判别算法:引用计数算法可达性分析算法
2. 引用计数算法
  • 1.原理:为每个对象维护一个引用计数器,每当有地方引用该对象时,计数器加1;当引用失效时,计数器减1。当计数器的值为0时,表示该对象不再被引用,可以被回收。
  • 2.优点:实现简单,判定效率高,回收没有延迟性。
  • 3.缺点:无法解决循环引用问题,即两个或多个对象相互引用,导致它们的引用计数器都不为0,从而无法被回收。因此,JVM在实际应用中并未广泛采用此算法。
2. 可达性分析算法
  • 1.原理 :从GC Roots(一组必须活跃的引用)出发,通过引用链搜索所有可达 的对象。如果某个对象到GC Roots没有任何引用链相连,则该对象被视为不可达,即垃圾对象。
  • 2.GC Roots的构成:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象等。
  • 3.优点:实现简单且执行高效,更重要的是能够有效地解决循环引用问题,防止内存泄漏。
  • 4.应用:JVM广泛采用可达性分析算法来判定垃圾对象。
3. 垃圾判别阶段的过程
  • 1.暂停应用线程 :为了进行垃圾判别和回收,JVM需要暂停所有的应用线程,以防止在垃圾回收过程中对象的状态发生变化。这个过程通常被称为"Stop The World"(STW)。
  • 2.标记存活对象:JVM从GC Roots出发,通过可达性分析算法标记所有可达的对象。这些对象被视为存活对象,不会被回收。
  • 3.清除垃圾对象:在标记完存活对象后,JVM会清除所有未被标记的对象。这些对象被视为垃圾对象,其占用的内存空间将被回收。
  • 4.恢复应用线程:完成垃圾回收后,JVM会恢复所有被暂停的应用线程,使它们继续执行。
相关推荐
gmaajt2 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
maqr_1102 小时前
CSS如何利用Sass定义全局阴影方案_通过变量实现统一CSS风格
jvm·数据库·python
m0_613856292 小时前
uni-app怎么做类似于美团的商家评价星级 uni-app五星评分组件制作【实战】
jvm·数据库·python
2401_833033623 小时前
如何修复固定定位头部容器中悬浮下拉菜单的错位问题
jvm·数据库·python
z4424753264 小时前
CSS Grid布局如何实现网格项目的自动增长_设置grid-auto-flow- row
jvm·数据库·python
m0_740352424 小时前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
gmaajt4 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python
m0_495496414 小时前
C#怎么操作音频文件 C#如何用NAudio播放录制和处理WAV MP3音频文件【工具】
jvm·数据库·python
dFObBIMmai5 小时前
CSS如何检测页面浮动元素位置_使用审查工具与clear
jvm·数据库·python
qq_460978405 小时前
实现 Svelte 中基于数组索引的 details 元素单开单关交互
jvm·数据库·python