目录

  • 可达性分析算法
    • 什么样的对象可以当做Gc Roots?
    • 什么时候会触发垃圾回收?
  • 垃圾回收算法
    • 1.标记-清除算法
    • 2.复制算法
    • 3.标记-整理算法
    • 4.分代收集算法

我们都知道Java中是有垃圾回收机制的,那么哪些对象是应该被回收的呢?

这就需要来介绍-----可达性分析

在垃圾收集器准备回收对象时,首先要判断对象是否还活着,那么怎么判断对象是否还活着呢?

可以通过一种引用计数器法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加一,当引用失效时,计数器减一,当对象的计数器为0时代表该对象不再被使用。引用计数法实现简单,判定效率也很高,但是有个比较大的问题:

引用计数法很难解决对象之间相互循环引用的问题

可达性分析算法

可达性分析算法是通过一系列“ GC Roots ”的对象作为起点,从这些节点开始往下搜索,搜做走过的路径称为引用链,当一个对象到Gc Roots没有任何引用链时,则证明该对象是不可用的,该对象会判定为可回收的对象。

什么样的对象可以当做Gc Roots?

  • Java虚拟机栈(局部变量表)中引用的对象
  • 处于存活状态中的线程对象
  • 方法区中静态引用指向的对象
  • Native方法中JNI引用的对象

什么时候会触发垃圾回收?

一般下面两种情况下会触发GC:

  • Allocation Failure:在堆内存中分配时,如果因为可用剩余空间不足导致对象内存分配失败,会触发一次GC
  • System.gc():应用层主动调用此API来请求一次GC

垃圾回收算法

1.标记-清除算法

标记-清除算法是最基础的的收集算法,它分为“标记”和"清除"两个阶段:标记出所有需要回收的对象(找到内存中所有的GC Root对象,和GC Root直接或者间接相连的标记为存活对象,否则标记为垃圾对象),标记完成后统一回收被标记垃圾对象

标记-清除算法是最基础的算法,后续的算法都是在它基础上进行改进得到的。

它有两个缺点:

1、效率不高,标记和清除两个过程效率都不高

2、标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作

2.复制算法

复制算法将可用内存按容量划分为大小相等的2块,每次只使用其中的一块。当其中一块内存用完了,就将还存活的对象复制到另一块内存中去,然后把已经使用过的内存空间一次性清理掉。

优点:实现简单,运行高效,不用考虑内存碎片等复杂情况。
缺点:内存使用直接缩小为原来的一半;且在对象存活率较高时会进行较多的复制操作,效率会变低。

3.标记-整理算法

标记-整理(Mark-Compat)算法的标记过程与标记-清除算法是一样的,但后续步骤不是直接对可回收对象进行清除操作,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

优点:避免了内存碎片的产生,也不用将内存一分为二,性价比较高。
缺点:仍需要进行局部对象移动,当存活对象较多时还是会影响效率。

4.分代收集算法

根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适合的收集算法。

在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成。

而老年代中因为对象存活率高、没有额外空间对他进行分配担保,就必须使用**“标记-清理”或者“标记-整理”算法**来进行回收。

在Java虚拟机分代垃圾回收机制中,应用程序可用的堆空间可以分为年轻代老年代,然后年轻代有被分为Eden区,From区与To区

当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收

一般来说这时候不是所有的对象都没用了,所以就会把还能用的对象复制到From区。

这样整个Eden区就被清理干净了,可以继续创建新的对象,当Eden区再次被用完,就再触发一次YoungGC,然后呢,注意,这个时候跟刚才稍稍有点区别。这次触发YoungGC后,会将Eden区与From区还在被使用的对象复制到To区

再下一次YoungGC的时候,则是将Eden区与To区中的还在被使用的对象复制到From区

经过若干次YoungGC后,有些对象在From与To之间来回游荡,这时候From区与To区亮出了底线(阈值),这些对象要是到现在还没挂掉,就会一起复制到老年代。

老年代经过这么几次折腾,空间也会被用完,好,那就来次集体大扫除(Full GC),也就是全量回收,一起回收。

全量回收呢,就好比我们刚才比作的大扫除,毕竟动做比较大,成本高,不能跟平时的小型值日(Young GC)相比,所以如果Full GC使用太频繁的话,无疑会对系统性能产生很大的影响。

所以要合理设置年轻代与老年代的大小,尽量减少Full GC的操作

【Java】Java的垃圾回收相关推荐

  1. JVM 调优实战--什么是垃圾回收及Java的自动垃圾回收GC

    什么是垃圾回收 程序的运行必然要申请内存资源,无效的对象资源如果不及时处理就会一直占用内存资源,最终将导致内存溢出,所以对内存资源的管理就变得非常重要了. C/C++语言的垃圾回收 在C/C++语言中 ...

  2. 一文搞懂JAVA与GO垃圾回收

    导语  现代高级编程语言管理内存的方式分为两种:自动和手动.像 C.C++ 等编程语言使用手动管理内存的方式,编写代码过程中需要主动申请或者释放内存:而 PHP.Java 和 Go等语言使用自动的内存 ...

  3. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

  4. 高吞吐低延迟Java应用的垃圾回收优化

    高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...

  5. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  6. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  7. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  8. java基础之垃圾回收_繁星漫天_新浪博客

    在java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足.针对这种情况,java中引入了垃圾回收机制.程序员不需要过多的关心垃圾对象回收的问题,java虚拟机会自动回收垃圾 ...

  9. java gc 有钱人_小猿圈java之GC垃圾回收机制

    垃圾回收机制是提高性能的重要机制,所以不管学什么语言也好,垃圾回收机制都是有的,也是很重要的,小猿圈这章详解一下java的GC垃圾回收机制,需要用的或者感兴趣的朋友们,可以跟着小编学习一下. 一.GC ...

  10. java虚拟机多久触发垃圾回收_每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

最新文章

  1. 1个Python特征选择工具,助力实现高效机器学习
  2. angularjs -- 路由监听
  3. anconda安装及opencv配置
  4. rhel7+apache+c cgi+动态域名实现web访问
  5. Java在几乎所有方面都可以胜任本机响应
  6. 无状态EJB:池化和生命周期
  7. C++primer 9.3.3节练习
  8. Table是怎样炼成的:HtmlTable
  9. 第十八章、ActiveX控件
  10. PPT出图修改dpi
  11. 【Web渗透测试】—Web漏洞
  12. 软件架构设计说明书该怎么写?
  13. easyExcel下载Excel
  14. android 从app跳转到微信小程序和微信没有设置浮动权限 打不开小程序
  15. 怎么把win10退回win7系统
  16. 星际2中复刻DOTA白虎
  17. 一种基于Android的卡拉
  18. ARM7 ARM 11
  19. Macbook电池使用问题——电池充电管理
  20. linux vi 保存退出与不保存退出

热门文章

  1. fgets和fputs的使用
  2. javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher su 解决办法
  3. 【React】一路走来并持续竞走
  4. Java数组讲解(数组,字符串数组,多态数组)
  5. 用友BIP对接外部旺店通企业版奇门系统
  6. 解决Vmware虚拟机下运行Linux电脑发出声音
  7. 硬件知识(一)无源RC一阶滤波电路
  8. 微信公众平台接口,asp.net实现
  9. 什么是软件测试,软件测试究竟是做什么的
  10. MIPI DSI协议