Java虚拟机(JVM)垃圾回收机制

JVM中的垃圾回收计数是采用的一种自适应的技术(可以通过其工作方式将它“啰嗦地”称为:自适的、分代的、停止-复制、标记-清扫式垃圾回收器)

在讲Java虚拟机的自适应回收机制前,有必要说一下其他比较单纯的垃圾回收机制,然后会比较容易地理解JVM的垃圾回收:

1、引用计数

一种简单但速度很慢的垃圾回收计数。

​ 每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加 1 ;当引用离开作用域或者被置为null时,引用计数减 1 。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为 0 时,就释放其占用的空间。

​ 引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用于任何Java虚拟机的实现中。

缺点:

  • 虽然管理引用计数开销不大,但这种开销在整个程序的生命周期中是持续发生的。
  • 如果对象之间存在循环引用,可能会出现“对象应该被回收,但是其引用计数却不等于 0 ”的情况,且定位如此交互自引用的对象组对于垃圾回收器来说所需的工作量极大

2、找到所有“活”的对象

​ 对于一些更快(回收性能更优秀)的垃圾回收技术,依据的思想:**对于任何“活着”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。 **

​ JVM便是在基于此种方式采用的一种自适应的垃圾回收技术。不过对于如何处理找到的存活对象,这取决于不同的Java虚拟机实现。

  1. “停止-复制”

    ​ 先停止程序的运行,然后把所有存活的对象从当前堆复制到另一个堆中,其中没有被复制的对象都是“死”的,便是需要清除、释放的垃圾了。

    优点:

    • 当对象复制到新堆时,在新堆中保持紧凑排列,可以简单、方便地分配新空间。

    缺点:

    • “复制-回收”并不属于后台回收模式,该种模式下需要事先停止程序运行。即垃圾回收动作发生时候,程序会被暂停。
    • 效率不高,原因如下:
      1. 需要有两个堆,然后在两个堆之间来回折腾,需要维护的空间比实际的多了一倍。
      2. 程序进入稳定状态时,可能只会产生少量的垃圾,但此时复制式垃圾回收器还是会把几乎所有内存从一处复制到另一处,非常浪费。
  2. “标记-清扫”

    ​ 从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象;每当找到一个存活对象,便会给对象设一个标记。只有全部标记工作完成时候,才会开始清理动作。

    优点:

    • 清理过程中,没有标记的对象将被释放,不用进行任何复制动作

    缺点:

    • 清理后剩下的堆空间是不连续的,如果希望得到连续空间的话,需要重新整理剩下的对象。

3、JVM中自适应的垃圾回收机制

​ 在这里讨论的Java虚拟机中,内存分配以较大的“块”为单位;当对象比较大时,会占用单独的块。

​ 有了块的概念之后,我们可以对“复制-回收”的回收机制做一定的改进。之前的“复制-回收”要求在释放旧有对象之前,必须将所有存活对象从旧堆复制到新堆中,这会导致大量的内存复制行为;有了块之后,我们可以往废弃或闲置的块中复制对象

​ 那如何判断某个块是不是闲置的呢?每个块都是用对应的一个代数(generation count)记录该块是否还存活;如果该块在某处被引用,其代数便会增加。

​ 垃圾回收器会定期地进行完整的清理动作——大型对象(占用单独的块)不会被复制,而含有小型对象的那些块便会被复制并整理。

​ 在这过程中,JVM会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低了,就切换到“标记-清扫”方式;而当“标记-清扫”下堆空间出现很多碎片时,便会切换回“停止-复制”方式。(所以知道为什么叫他“自适的、分代的、停止-复制、标记-清扫式垃圾回收器”了吧……)

Java虚拟机的回收机制介绍的差不多了,也只是比较表面的介绍,之后有机会、有能力的话再写写更加详细些的,嘻嘻。

参考文献:
《Java编程思想 Thinking in Java》 Bruce Eckel 著

JVM垃圾回收机制【简单介绍】相关推荐

  1. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

  2. 2.JVM垃圾回收机制-什么时候回收内存

    在前面的文章中,我们介绍过JVM垃圾回收机制负责的是堆和方法区的内存. 参考:http://blog.csdn.net/u011983531/article/details/49227013 在本篇中 ...

  3. 周志朋java_java中堆和垃圾回收机制的介绍

    java中堆和垃圾回收机制的介绍 发布时间:2020-07-03 14:55:53 来源:亿速云 阅读:113 作者:元一 这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较 ...

  4. 2020最全JVM垃圾回收机制面试题整理,阿里面试官最爱问的都在这里了(附答案)

    前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...

  5. JVM架构、JVM垃圾回收机制、垃圾回收算法、垃圾回收器、JMM(内存模型)

    0 JVM和Java的关系 JDK = JRE + Java开发工具(java,javac,javadoc,javap-) JRE = JVM + Java核心类库 即: JDK = JVM + Ja ...

  6. JVM垃圾回收机制及算法

    JVM垃圾回收机制 在Java中,程序员是不需要像C++那样显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空 ...

  7. 【JVM】JVM垃圾回收机制GC

    文章目录 JVM垃圾回收机制 一.堆内存区域划分 1.1内存分配策略 1.2永久代(Permanent Generation) 1.3元空间(MetaSpace) 二.标记算法 2.1引用计数算法 2 ...

  8. 深入理解JVM—垃圾回收机制

    一.前言 明确垃圾收集器关注的部分:堆和方法区.着重学习如何确定哪些垃圾需要回收.垃圾回收算法以及GC触发条件. 二.如何确定哪些垃圾需要回收 1.引用计数算法 在对象中添加一个引用计数器,每当有一个 ...

  9. JVM垃圾回收机制(超级无敌认真好用,万字收藏篇!!!!)

    文章目录 JVM垃圾回收机制 1 判断对象是否存活的算法 1.1 引用计数器算法 1.2 可达性分析算法 2 对象的四种引用方式 2.1 强引用 2.2 软引用 2.3 弱引用 2.4 虚引用 3 垃 ...

  10. 【深入理解JVM 七】JVM垃圾回收机制

    前边几篇Blog分别介绍了JVM的类加载机制.运行时数据区域,字节码的执行,在执行完成后程序发挥完了自己的作用,线程独有的程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭,而线程共享的堆 ...

最新文章

  1. android bitmap 转drawable,android Drawable转换成Bitmap失败
  2. Matlab与线性代数 -- 矩阵的重组3
  3. 家居建材企业信息化管理路在何方?
  4. 如何阅读 Vivado中的Timing Report
  5. arm-buildroot-linux-,buildroot构建交叉编译工具链,根文件系统
  6. ubuntu查看cudnn是否安装成功_深度学习之目标检测系列(0) -ubuntu18.04+RTX2080Ti+cuda+cudnn安装...
  7. 石墨烯区块链(4)API
  8. 单页面应用SPA的优缺点
  9. Bugku杂项(一)
  10. 安卓自动化测试(一)
  11. Typeface 字体样式
  12. VMware VIC
  13. 7个顶级资源网站,不知道就很可惜
  14. mysql limit asc_MySql sql优化之order by desc/asc limit M-阿里云开发者社区
  15. HTML左边和右边是固定的宽度但是中间是自动的布局方式
  16. python消息中间件activemq_消息中间件ActiveMQ和JMS基础
  17. Java对象序列化乱码6_对象序列化成字符串乱码解决
  18. Python 文件编码问题解决
  19. Eclipse卸载插件SpringSoource-tool-suite
  20. raspberry ubuntu 修改源为清华_在Windows7基础上安装Ubuntu系统,实现双系统操作

热门文章

  1. html切图软件,切图工具/插件介绍
  2. 小白快速入门Laravel 5.8框架
  3. hprose-php教程,hprose php用户手册
  4. 2021年电工(初级)考试资料及电工(初级)考试技巧
  5. 一文详解 RSA 非对称加密算法
  6. 什么是深度卷积神经网络,卷积神经网络怎么学
  7. 如何将PPT导出为60帧的视频
  8. 利用HTML完成登陆界面设计
  9. SecureCrt中文破解版直接下载使用免破解免安装并解决中文乱码问题
  10. 斯托尔兹(Stolz)定理