除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的。这是因为,堆中没有连续的空闲空间放得下新的对象。

垃圾收集器算法

  任何垃圾回收算法都必须做两件事,首先,它必须检测出垃圾对象。其次,它必须回收垃圾对象所使用的堆空间并还给程序。从根对象开始,任何可以被触及的对象都被认为是“活动的”对象(如果正在运行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的)

(1)引用计数收集器

  是垃圾回收的早期策略,在这个方法中,堆中每一个对象都有一个计数器。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数器被置为1。

  当任何其他变量被赋值为对这个对象的引用时,计数加1.

  当一个对象的引用超过了生命期或者被设置一个新的值时,对象的引用计数减1.

任何引用计数器为0的对象可以被当作垃圾收集。

优点:引用计数器可以交织在程序之中,对于程序不能被长时间打断的实时环境很有利。  缺点:引用计数无法检测出循环(即两个或者更多的对象相互引用)

(2)跟踪收集器

  从根节点开始的对象引用图,在追踪过程中遇到的对象以某种方式打上标记。要么在对象本身设置标记,要么用一个独立的位图来设置标记。当追踪结束后,未被标记的对象就知道是无法触及的,从而可以被垃圾回收。

JAVA虚拟机的垃圾收集器可能有对付堆碎块的策略。标记并清除收集器通常使用的两种策略是压缩和拷贝。 其实现原理是快速地移动对象来减少堆碎块。压缩收集器把活动的对象越过空闲区移动到堆的另一端,那么在堆的另一端就出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。(对象的引用实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置。当对象被移动了,只有这个句柄需要被更新为新位置。所有的程序中对这个对象的引用仍然指向这个具有新值的句柄,而句柄本身没有移动。

优点:简化了消除堆碎块的工作。  缺点:每一次对象访问都带来了性能的损失。

(3)拷贝收集器

  把所有的活动对象移动到一个新的区域。在拷贝的过程中,它们是紧挨着布置,消除原本它们在旧区域的空隙。对象被快速拷贝到一个新的区域,同时转向指针仍然留在原来的位置。转向指针可以让垃圾收集器发现已经被转移的对象的引用。然后垃圾收集器可以把这些引用设置为转向指针的值,所以它们现在指向对象的新位置。 这个算法的特点是"停止并拷贝"。任何时候都只使用一个区域,对象在同一个区域中分配,直到这个区域被耗尽。此时,程序执行被终止,堆被遍历,遍历时遇到的活动对象被拷贝到另一个区域。当停止和拷贝过程结束,程序恢复执行。

优点:对象可以在从根对象开始的遍历过程中随着发现被拷贝,不再有标记和清除的区分。  缺点:要分配两倍的堆内存,每次都把生命周期很长的对象来回拷贝,消耗大量的时间。

(4)按代收集的收集器

  通过把对象的寿命来分组解决拷贝收集器的效率低下的问题。在这个方法里,堆被分为两个或者更多的子堆,每一个子堆为一"代"对象服务。最年幼的那一代进行最频繁的垃圾收集。如果一个最年幼的对象经历了好几次的垃圾回收依旧存活,那么这个对象就成长为寿命最高的一代。被转移到另一个子堆中去。

(5)自适应收集器

  自适应算法监视堆中的情形,并且对应地调整为合适的垃圾收集技术。

以上垃圾回收机制都会造成程序的中断-运行的过程,并不适用于实时性比较高的系统。

参考:《深入java虚拟机》

转载于:https://www.cnblogs.com/yangsy0915/p/5440743.html

JAVA虚拟机垃圾回收算法原理相关推荐

  1. 了解java虚拟机—垃圾回收算法(5)

    引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...

  2. JAVA虚拟机垃圾回收机制和JAVA排错三剑客

    一.Java虚拟机逻辑回收机制 1.Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Al ...

  3. Java虚拟机垃圾回收相关知识点全梳理(下)

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 上一篇文章<Java虚拟机垃圾回收相关知识点全梳理(上)>我整理分享了JVM运行时数据区域的划分,垃圾判 ...

  4. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  5. Java虚拟机 —— 垃圾回收机制

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

  6. HotSpot 虚拟机垃圾回收算法实现

    作为使用范围最广的虚拟机之一HotSpot,必须对垃圾回收算法的执行效率有严格的考量,只有这样才能保证虚拟机高效运行 枚举根节点 从可达性分析中从 GC Roots 节点找引用链这个操作为例,可以作为 ...

  7. 老生常谈Java虚拟机垃圾回收机制(必看篇)

    垃圾收集 垃圾收集主要是针对堆和方法区进行. 程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. 判断一个对 ...

  8. Java虚拟机-垃圾回收简介

    一.如何判定对象为垃圾对象 -verbose:gc 打印垃圾回收简单信息参数 -xx:+PringDCDetail 打印垃圾回收的详细信息 引用计数法 引用计数算法很简单,它实际上是通过在对象头中分配 ...

  9. 深入理解Java虚拟机垃圾回收机制

    文章目录 什么是垃圾回收 哪些内存需要被回收?什么时候回收?如何回收? 哪些内存需要被回收?什么时候回收? 引用计数算法 可达性分析算法 如何回收?(垃圾收集算法) 标记-清除算法 复制算法 标记-整 ...

最新文章

  1. java str2date,java date类与string类实例代码分享
  2. mysql的FIQ怎么安装_MySQL数据库设计总结
  3. 数据结构-循环单链表之魔术师发牌问题
  4. 开发人员的幸福:您需要知道的
  5. 静态代码块无法对静态变量赋值的原因
  6. Android开发笔记(一百五十八)运行时动态授权管理
  7. ubuntu启动配置ftp服务端
  8. 均匀带电的无限大平面划成无限长直线积分计算场强
  9. 【论文】PathQG: 基于事实的神经问题生成
  10. LeetCode刷题——88. 合并两个有序数组
  11. 威纶触摸屏与电脑连接_威纶触摸屏与三菱PLC通信接线方法
  12. LearnGL - 13 - PointLight - 点光源
  13. 最近写收缩标题栏遇到的一个问题 requestLayout() improperly called by android.support.design.widget.CollapsingToolba
  14. c语言输出行末不得有多余空格,2019年春季学期第四周作业
  15. ovs-docker实现容器网络vlan隔离
  16. Unity 简单随机创建玩家游戏名
  17. Apple Pay 在线远程支付
  18. 互联网公司的几种“死法”
  19. 在FDTD中创建锥体
  20. 联想拯救者r720自带win10安装linux(ubuntu)双系统

热门文章

  1. linux 迁移mysql目录_linux默认mysql迁移目录
  2. python第三方库文件传输_本地 Python 代码上传到 Python 第三方库(Pypi)
  3. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator
  4. laravel并行访问MySQL_laravel实现多数据库连接配置
  5. mysql数据库 uft8_unicode_ci是utf8吗_MysQL数据库中utf8_unicode_ci与utf8_general_ci的区别
  6. Jdk并发线程处理CountDownLatch、CyclicBarrier、Semaphore
  7. java print int_java – 在printin输入int
  8. 贴片晶振脚位_贴片晶振的焊接方法和注意事项
  9. 8g内存一般占用多少_手机的运行内存6g和8g有什么区别?内行人一语道破,别被骗了...
  10. html5播放视频自动循环播放,HTML5 通过Vedio标签实现视频循环播放的示例代码