首页 > 编程语言 >jvm之垃圾回收算法

jvm之垃圾回收算法

时间:2023-04-23 10:36:47浏览次数:32  
标签:标记 对象 回收 算法 GC 垃圾 jvm 引用


垃圾回收算法

哪些内存需要回收

jvm的内存模型中将内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。

其中程序计数器、虚拟机栈、本地方法栈属于线程私有的内存空间,与线程的生命周期保持一致,不需要手动回收内存。

方法区中存放的是类的结构信息,对方法区的回收其实就是对类进行卸载,类的卸载必须满足以下三个条件:

  1. 类的实例及其子类实例已经全部被回收
  2. 加载类的类加载器已经被回收,通常加载类的加载器是用来加载应用中所有的类的,所以一般不会被回收。
  3. 类的Class对象没有被其他对象所引用

基于以上三点,方法区能回收的内存空间是比较小的,可以通过虚拟机参数-Xnoclassgc来控制。

综上,垃圾回收的重点区域为堆。

怎么判断对象已死

堆上面存储的是对象,那么这些对象什么时候应该被收回呢?当然是没有其他对象引用它时,也就是对象已死。

通常有下面两种方法来判断哪些是活着,哪些对象已死:

  • 引用计数法
  • 可达性分析

引用计数法

引用计数法是通过为每个对象创建一个引用计数器,当这个对象每被其他对象引用一次时,引用计数器就会加1,当引用失效时,引用计数器就会减1,当引用计数器为0时,代表这个对象可以被回收了。

缺点:无法解决循环引用问题,如果A引用B,B引用A,那么这两个对象的引用计数器将会一直为1,永远无法被回收。

可达性分析

可达性分析就是通过一系列的GC Roots对象作为根节点,从这些根节点开始,根据引用关系向下搜索,搜索过程中所走过的路径称为引用链,如果某个对象与GC Roots对象之间没有任务引用链相连,那么就可以判断这个对象可以被回收。

jvm之垃圾回收算法_jvm

可以作为GC Roots的对象包括以下几种:

  • 虚拟机栈中的局部变量所引用的对象
  • 方法区中的静态变量
  • 方法区中的常量
  • 本地方法栈中所引用的对象
  • jvm内部引用的对象,如基本数据类型对应的包装类,系统类加载器
  • 被synchronized持有的对象

注意:

  • 我们这里说的是活跃的引用,而不是对象,对象是不能作为GC Roots的。
  • GC过程是找出所有活对象,并把其余空间认定为“无用”;而不是找出所有死掉的对象,并回收它们占用的空间。

怎么回收

Minor GC/Young GC:指发生在新生代的垃圾收集动作,非常频繁,速度较快。

Major GC/Old GC:指发生在老年代的GC,出现Major GC,经常会伴随一次Minor GC,同时Minor GC也会引起Major GC,一般在GC日志中统称为GC,不频繁。

Full GC:指发生在堆和方法区的GC。

标记-清除算法

标记清除法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段,首先通过根节(GC Roots),标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。

jvm之垃圾回收算法_标记整理算法_02

标记清除算法的缺点:产生大量的空间碎片。

标记-复制算法

标记-复制算法一般简称为复制算法。

复制算法将原有的内存空间分为两块相同的存储空间,每次只使用一块,在垃圾回收时,将正在使用的内存块中存活对象复制到未使用的那一块内存空间中,之后清除正在使用的内存块中的所有对象,完成垃圾回收。

jvm之垃圾回收算法_标记清除算法_03

复制算法适用于垃圾对象较多的场景,没有碎片空间。但是复制算法的代价是将系统内存空间折半,只使用一半空间,而且如果内存空间中垃圾对象少的话,复制对象也是很耗时的,

标记-整理算法

标记-整理算法在标记-清除算法的基础上做了优化。首先从根节点开始,对所有可达的对象做一次标记,然后将所有的存活对象压缩到内存空间的一端,最后清理边界外所有的空间。这样做避免的碎片的产生,又不需要两块相同的内存空间,因此性价比高。

jvm之垃圾回收算法_jvm_04

分代算法

分代算法将内存空间根据对象的特点不同进行划分,选择合适的垃圾回收算法,以提高垃圾回收的效率。

新生代的特点是:对象朝生夕灭,大约90%的对象会很快回收,因此,新生代比较适合使用复制算法。

新生代分为一块较大的Eden空间和两块较小的survivor空间,当回收时,将Eden空间和其中一块Survivor空间中存活的对象复制到另一块Survivor,最后清理掉Eden空间和刚刚使用过的Survivor空间。

老年代的存活率是很高的,如果依然使用复制算法回收老年代,将需要复制大量的对象。这种做法是不可取的,根据分代的思想,对老年代的回收使用标记清除或者标记压缩算法可以提高垃圾回收效率。

更多精彩内容关注本人公众号:架构师升级之路

jvm之垃圾回收算法_jvm_05


标签:标记,对象,回收,算法,GC,垃圾,jvm,引用
From: https://blog.51cto.com/u_6784072/6216460

相关文章

  • 十大排序算法之归并排序
    归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。算法步骤不断地将当前序列平均分割成2个子序列,直......
  • jvm之线程上下文加载器与SPI
    线程上下文加载器线程上下文类加载器(ThreadContextClassLoader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoadercl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader......
  • jvm如何打破双亲委托机制
    打破双亲委托机制重写父类ClassLoader的loadClass方法packagecom.morris.jvm.classloader;publicclassBreakDelegateClassLoaderextendsMyClassLoader{@OverrideprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{......
  • JVM内存模型
    JVM内存模型JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。下图是jdk8jvm内存模型图:程序计数器程序计数器是当前线程所执行的字节码的行号指示器。JVM支持多个线程同时运行,每个线程都会根据CPU时间片来回切换,那么如果当前线程获得时间片了,怎么知道它......
  • 排序算法之希尔排序
    希尔排序1959年由唐纳德·希尔(DonaldShell)提出希尔排序。希尔排序的思想:把数组中的元素看作是一个矩阵,分成m列,逐列进行排序(一般采用插入排序),m从某个整数逐渐减为1,当m为1时,整个序列将完全有序。因此,希尔排序也被称为递减增量排序(DiminishingIncrementSort)。矩阵的列数取决于步长......
  • Java虚拟机之JVM工具监控调优
    我是攻城师(woshigcs)前几篇我们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacor......
  • Redis、Memcached、Guava、Ehcache中的算法
    1.LRU简单粗暴的Redis今天看 Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不得,这旧版的"近似LRU"算法,实在太简单,太偷懒,太Redis了。在 Github的Redis项目里搜索lru,找到代码在redis.c的freeMemoryIfNeeded()函数里。先看 2.6版的代码:竟然就是随机找三......
  • 代码随想录算法训练营第四天 | 24.两两交换链表
     ......
  • m基于WDM网络的波长分配算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要       波分复用WDM(WavelengthDivisionMultiplexing)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器,Multiplexer)汇合在一起,并耦合到光线路的同一......
  • 其他--解封垃圾CSDN的"关注博主即可阅读"限制
    问题缘由其实遇到好博主和好文章,点赞关注是大部分人的基本操作,但不要脸的CSDN为了广告收入强制让用户登录和用户关注的事情太恶心,CSDN真的是中国互联网的耻辱。解除限制以Chrome浏览器为例,在"书签"==>"书签管理器"==>"新增书签"下设置JavaScript:(function(){ varart......