深入理解java虚拟机-垃圾回收机制(gc)

renguangli      2022-04-09     382

关键词:

垃圾回收机制(GC)是java常重要特性之一。它让开发者无需关注内存的创建和释放,而是通过GC自动回收垃圾(无用对象)。

哪些内存需要回收

java堆和方法区是垃圾回收的主要内存区域,程序计数器、虚拟机栈、本地方法栈这几个内存区域是现成私有的,线程结束时内存自然也就回收了。

如何判断对象可回收?

在java堆里存放着几乎所有的对象实例,垃圾收集器在进行垃圾回收之前第一件事情就是判断哪些对象还"活着",哪些对象已"死去"(不会再被使用的对象);

引数记数法

引数记数法就是给对象添加一个引数计数器,每当有其他地方引用对象时,计数器就加1;当引用失效时,计数器就减1,如果计数器任何时刻都为0,那么对象不可能在被使用,垃圾收集器就可以进行回收了。引数记数法简单高效,微软公司的COM技术,python语言,游戏脚本语言Squirrel都是使用了引数记数法进行内存管理。但是主流java虚拟机没有使用引述记数法进行内存管理,原因主要是他很难解决对象之间互相引用的的问题。

可达性分析算法

java虚拟机是通过可达性分析算法来判定对象是否存活的。可达性分析算法的主要思想是通过一系列的称为"GC Roots"的对象作为起始点从这些起点开始向下搜索,搜索走过的路径称为引用链,当一个对象到"GC Roots"没有任何引用链相连时("GC Roots"到此对象不可达),则证明此对象是不可用,可回收的。

在java语言中,可作为"GC Roots"的对象包括以下几种

  • 虚拟机栈()中引用的对象
  • 方法区中类静态变量引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

垃圾收集算法

简单介绍下几种垃圾收集算法

标记-清除算法

最简单的垃圾收集算法是“标记-清除”算法,算法分为“标记”和“清除”两个阶段:首先要标记出需要回收的对象,在完成标记后统一回收所有被标记的对象。标记过程就是判断哪些对象需要回收。
标记-清除算法有两个不足之处:
一个是效率问题,标记-清除的效率都不高;
另一个空间问题,标记-清除之后会产生大量不连续的内存碎片,内存空间碎片太多可能会导致java虚拟机在分配较大对象时,无法找到足够的连续内存而触发一次垃圾收集动作。

技术分享图片

复制算法

复制算法是为了解决标记-清除算法的效率问题而产生的。它是如何解决效率问题的呢?

复制算法将内存分为两块大小相等的两块,每次只使用其中一块。当这一块的内存用完了,将存活的对象复制到另一块上,然后将使用过的一块内存全部清理掉。这样每次都是对整个半区进行垃圾回收,内存分配时就不需要担心内存碎片的问题了。复制算法实现简单,运行高效。代价就是内存缩小为原来的一半。

技术分享图片

复制算法主要用来回收新生代,IBM的专家研究过,新生代的中的对象98%都是“朝生夕死”的,并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次只使用Eden和其中一块Survivor空间。当进行垃圾回收时将Eden和Survivor中还存活的对象复制到另一块Survivor空间上,最后清理掉Eden和使用过的Survivor空间。Eden空间和两块Survivor空间之间的比例时8:1:1,新生代可用空间为90%(80% + 10%),只浪费了10%内存空间。当存活对象多于10%时,Survivor空间不够用,这些对象将通过分配担保机制直接进入老年代。

标记整理算法

老年代是通过标记-整理算法来进行垃圾回收的。标记过程与标记-清除算法一样,清除过程不是直接清理可回收对象,而是让所有的对象都向一端移动,然后直接清理掉边界以外的内存。

技术分享图片

分代收集算法

现代商业虚拟机的垃圾收集都采用“分代收集”算法,分代收集算法根据对象存活周期的不同将java堆内存分为新生代和老年代。新生代每次垃圾收集时大量对象死去,只有少量对象存活,那就使用复制算法。老年代中的对象存活率高,没有额外内存空间进行担保,那就使用标记清除算法或者标记整理算法。

垃圾收集器

未完。。。

参考资料

《深入理解java虚拟机》




深入理解java虚拟机gc垃圾回收-垃圾收集算法

文章目录前言一、分代收集理论二、标记-清除算法三、标记-复制算法四、标记-整理算法结尾前言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(ReferenceCountingGC)和“追踪式垃... 查看详情

深入理解java虚拟机gc垃圾回收-垃圾收集算法

文章目录前言一、分代收集理论二、标记-清除算法三、标记-复制算法四、标记-整理算法结尾前言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(ReferenceCountingGC)和“追踪式垃... 查看详情

深入理解java虚拟机gc垃圾回收-经典垃圾收集器

文章目录前言一、Serial收集器(标记-复制算法)二、ParNew收集器(标记-复制算法)三、ParallelScavenge收集器(标记-复制算法)四、SerialOld收集器(标记-整理算法)五、ParallelOld收集器(标记-整理算法)六、CMS收集器(标记-清除算法)七、GarbageFi... 查看详情

《深入理解java虚拟机系列二》---垃圾回收算法(通俗易懂)

...除算法2.3标记-复制算法2.4标记-整理算法前言本文对应《深入理解Java虚拟机》一书的第三章GC算法部分,这章主要讲的就是GC(GarbageCollection— 查看详情

《深入理解java虚拟机》垃圾收集器

 说起垃圾收集(GarbageCollection,GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当List还在胚胎时期时,人们... 查看详情

深入理解java虚拟机gc垃圾回收-虚拟机及垃圾收集器日志参数总结(代码片段)

文章目录前言一、虚拟机及垃圾收集器日志二、垃圾收集器日志分析样例三、JDK9前后日志参数变化四、垃圾收集器参数总结结尾前言阅读分析虚拟机和垃圾收集器的日志是处理Java虚拟机内存问题必备的基础技能,垃圾收集... 查看详情

深入理解java虚拟机gc垃圾回收-对象存活算法(代码片段)

文章目录前言一、引用计数算法二、可达性分析算法三、了解引用结尾前言在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪... 查看详情

深入理解java虚拟机gc垃圾回收-对象存活算法(代码片段)

文章目录前言一、引用计数算法二、可达性分析算法三、了解引用结尾前言在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪... 查看详情

深入理解java虚拟机

title:深入理解Java虚拟机date:2020-05-1410:58:24tags:JVM,虚拟机目录title:深入理解Java虚拟机date:2020-05-1410:58:24tags:JVM,虚拟机1.运行时数据区域2.GC垃圾回收3.内存分配与回收策略4.类加载机制1.加载2.验证3.准备4.解析5.初始化5.类与类加载器1.... 查看详情

深入理解java虚拟机gc垃圾回收-低延迟垃圾收集器(shenandoahzgc)(代码片段)

文章目录前言一、Shenandoah收集器1.Shenandoah介绍2.Shenandoah与G1对比3.Shenandoah工作原理4.Shenandoah并行整理的核心概念-BrooksPointer5.性能测试二、ZGC收集器1.ZGC介绍2.ZGC并发整理技术3.ZGC工作原理4.ZGC与G1、Shenandoah相比5.性能测试结尾前言... 查看详情

理解androidjava垃圾回收机制

...GC原理。Jvm(Java虚拟机)内存模型从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线。Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆。堆是运行时数据区域&# 查看详情

深入理解java虚拟机-java内存区域,垃圾回收机制和内存分配策略(代码片段)

本篇主要参考周志明老师的《深入理解Java虚拟机》第三版一个Java程序,首先要经过javac编译成.class文件,.class文件是给JVM进行识别的,JVM将.class文件加载到方法区,执行引擎会执行这些字节码,执行时,... 查看详情

java虚拟机垃圾回收机制

在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中。如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致OOM。JVM提供... 查看详情

java垃圾回收机制是啥?

...都使用类似的算法管理内存和执行收集操作。  在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应... 查看详情

深入理解java虚拟机类加载机制

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。本系列其他文章:【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM【深入理解Java虚拟机】垃圾回收机制1、类加载机制概述虚拟机把... 查看详情

搜集整理java中gc的理解

    Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身;S... 查看详情

java虚拟机原理垃圾回收算法(java虚拟机内存分区|垃圾回收机制|引用计数器算法|引用计数循环引用弊端)

文章目录一、Java虚拟机内存分区二、垃圾回收机制三、引用计数器算法(无法解决循环引用问题)一、Java虚拟机内存分区Java虚拟机内存分区:所有线程共有的内存区域:堆,方法区(元空间);方法区:存放静态变量,常量,class编译后的代... 查看详情

读书·深入理解java虚拟机(代码片段)

前言Java内存区域运行时数据区1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区内存溢出和垃圾回收1.内存溢出2.垃圾回收3.内存分配与回收策略虚拟机类加载机制1.加载2.验证3.准备4.解析5.初始化前言欢迎关注微信公众号“... 查看详情