在C++中,在heap上分配对象比在stack上分配对象更加昂贵。程序需要找到合适的内存块,再返回内存的地址。但是在Java中垃圾回收器显著地提高了在heap上分配对象的速度。听起来会有些怪,但是这就是Java垃圾回收器工作的方式。而且这意味着Java中在heap上分配对象几乎跟其他语言在stack上分配对象一样快。

比如说,C++中heap像是一个院子,每个对象占据自己的地盘。在一些JVM中,Java的heap更像是传送带,每次分配一个对象时,传送带就会往前进一点(而不需要寻找合适的内存空间)。

了解其他系统中垃圾回收时如何工作的对理解Java垃圾回收时有帮助的。一个简单却低效的垃圾回收机制是引用计数。在这种机制中,每个对象都有一个应用计数值,每次有一个引用指向一个对象,对象的引用计数值加一。每次一个引用离开作用域或者被设置为null,对象的引用计数值减一。因此,管理引用计数值是很小但是在程序生命周期中一直存在的花费。垃圾回收器遍历对象,当发现有对象的引用计数值为0,这意味着程序再也无法操作这个对象,对象将会被回收。有一个缺点是几个对象出现循环引用却不被其他对象引用。这些对象需要被回收,但是这些对象的引用计数值都不为0。检查循环引用需要垃圾回收器做额外的工作。引用计数常用来解释垃圾回收的工作原理,但是却没有被任何JVM实现使用。

在一些快速的垃圾回收机制中,垃圾回收不是基于引用计数。事实上,垃圾回收基于这样一个事实:任何一个活跃的对象都可以通过stack或者static对象通过链式引用找到。这个链式引用可以经过很多个对象。因此如果从stack或者static对象开始,遍历所有的引用,将会发现所有活跃的对象。对于每一发现的对象,都要继续寻找所有它引用的对象,直到不能再发现新的对象。需要注意到,循环引用的问题已经被解决,他们都不会被发现,因此自动被回收了。

JVM使用一种适应性的垃圾回收机制,具体的机制与它当前所使用的变种有关。其中一种变种是停止-复制(stop and copy)。这意味在程序首先被停止(不存在一种后台回收机制),然后每一活跃的对象都从原来的heap中复制到新的heap中,所有需要被回收的对象都被抛弃在原先的heap中。因为所有活跃的对象都被复制到新的heap中,他们会被重新分配空间,紧密相连,使得新的heap所占的空间较小,并却允许新的对象在heap空间后面直接被分配。

当一个对象从一个地方移动到另一个地方的时候,所有指向那个对象的引用都需要被改变。从stack或者static对象发出的引用都可以直接改变,heap对象发出的引用会在随后被改变。实际上在对象复制完成后,会建立一张表,表中建立旧地址到新地址的索引。随后遍历一遍heap对象,修改他们发出引用的地址。

有两个问题会导致停止-复制(stop and copy)机制效率比较低。第一个是需要两个heap,而且需要管理实际内存的两倍。有些JVM通过对heap分块,每次只复制一块内存。

第二个问题来自于复制过程本身。当程序稳定以后,会有很少或者没有垃圾产生。尽管这样 ,停止-复制(stop and copy)机制仍然把所有内存从一个地方复制到另一个地方,很大程度上降低了程序的性能。

为了解决这个问题,一些JVM检测到很少或没有垃圾产生时,切换到另外一种机制(这里体现了JVM垃圾回收机制的适应性)。这种机制称为标记-交换(mark-and-sweep)。这种机制在Sun早期的JVM中一直被使用。对于一般情况,标记-交换机制速度很慢,但是当产生的垃圾很少或者没有的时候,这种机制的速度较快。

停止-复制机制使用相同的逻辑:从stack或static对象出发,遍历所有的引用来发现活跃的对象。每当发现一个活跃的对象,就给对象树立一个标记。当遍历结束的时候,所有活跃的对象都被标记完成。这时遍历所有对象,回收所有没被标记的对象。在这个过程中没有发生复制。所以如果垃圾回收器需要收缩heap,需要改变对象的位置,填补回收之后的空间。

转载于:https://www.cnblogs.com/zoejiaen/p/4693894.html

Java垃圾回收工作原理相关推荐

  1. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  2. Java GC系列(2):Java垃圾回收是如何工作的

    转载自   Java GC系列(2):Java垃圾回收是如何工作的 本教程是为了理解基本的Java垃圾回收以及它是如何工作的.这是垃圾回收教程系列的第二部分.希望你已经读过了第一部分:<Java ...

  3. 详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...

  4. 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?

    大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...

  5. JVM 垃圾回收器工作原理及使用实例介绍

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自 ...

  6. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  7. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  8. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  9. [译]GC专家系列1:理解Java垃圾回收

    原文链接:http://www.cubrid.org/blog/de... 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮 ...

最新文章

  1. ubuntu -- 安装memcached
  2. 静态配置_Linux网络配置之NAT静态ip配置
  3. lambda 函数与 Generator 函数
  4. hdu 3962(AC自动机+矩阵优化dp)
  5. 如何访问云端的tcpserver_远程读写FTP文件,花生壳盒子+Serv-U快速实现远程访问...
  6. python显示range_python中range如何输出
  7. Codeforces Round #673 (Div. 2)——待补 E
  8. shapenet数据集什么格式_网络中的链路层数据格式是什么样?6个知识点1张图给您说明白...
  9. SQL Server数据挖掘–如何将数据转化为有价值的信息
  10. EasyUI常用控件禁用方法
  11. 中国计算机省份排名,2019中国省份经济排行_中国各省份经济排名
  12. 计算机专业去空军地勤能干嘛,空军地勤退役后能干什么?
  13. App ios 消息推送
  14. 文件上传、切片上传、秒传等
  15. 银行业务学习之道:信用卡的具体功能
  16. 基于主成分分析法的安全评价模型
  17. 云计算机概念,云计算是什么意思?
  18. 岩土工程渗流问题之有限单元法:理论、模块化编程实现、开源程序手把手实操技术
  19. 【003】基于51单片机的宠物自动定时、喂食系统的proteus仿真设计
  20. 将FBX模型转换为glb格式

热门文章

  1. android --相机使用详解概述
  2. 【翻译】(11)NDK Build
  3. 详解C#的数学类,Math,浮点数(上)
  4. 快乐的生活 2008-10-10 18:49:00
  5. Alluxio HA 写入文件失败
  6. hive(让我凌乱的一天)
  7. Java两种简单的获取页面源码的方法
  8. Gradle 10分钟上手指南
  9. HTML5基础01-网页的构造块
  10. Activiti 5.1.4最佳实践