2019独角兽企业重金招聘Python工程师标准>>>

垃圾回收机制

一、引用计数

特点:

简单,速度慢

原理:

每个对象都含有一个引用计数器,当有引用连接值对象是,引用计数加1.当引用离开作用域或被置为null时,引用计数减1.虽然管理引用计数的开销不大,但这项开销在整个程序生命周期中将持续发生。垃圾回收器会在含有全部对象的遍历表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。但是,引用计数模式经常会在计数值变为0时立即释放对象。这种方法还有个缺陷,如果对象之间存在循环引用,可能会出现对象应该被回收,但引用计数却不为0的情况。对垃圾回收器而言,定位这样的的交互自引用的对象组所需的工作量极大。

评价:

这种方式常用来说明垃圾收集的工作方式,但似乎从未被应用于java虚拟机实现中。

二、遍历所有的引用

思想:

对任何活的对象,一定能最终追溯到器存活在堆栈或静态存储区之中的引用。这个引用链条可能会产国数个对象层次,由此,如果从堆栈和静态存储区开始,遍历所有的的引用,就能找到所有活的对象。这种方式解决了交互自引用的对象组的问题。

这种方式下java虚拟机将此采用一种自适应的垃圾回收技术。至于如何处理找到的存活对象,取决于不同的实现。

  1. 停止-复制

    先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑排列,然后就可以按前述方法简单直接的分配新空间了。

    评价:

    这种所谓的复制式回收器,效率会降低,两个原因。

    首先,得有两个堆,然后在两个分离的堆之间来回倒腾,从而得维护比实际需要多一倍的空间。某些java虚拟机对此问题的处理方式是,按需从堆中分配几块较大的内存,复制动作发生在这些大块内存之间。

    第二个问题在于复制,程序进入稳定状态之后,可能只会产生少量垃圾,甚至没有垃圾。尽管如此,复制式回收器仍然会将所有内存自一处复制到另一处,这很浪费。为了避免这种情形,一些java虚拟机会进行检查:要是没有新垃圾产生,就会转换到另一种工作模式(即:自适应)。这种模式成为标记-清扫,sun公司早期的java虚拟机使用了这种技术。对一般用途而言,标记-清扫方式速度相当慢,但是当你知道只会产生少量垃圾甚至不会产生垃圾时,它的速度就很快了。

  2. 标记-清扫

    思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当它找到一个存活的对象,它就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开始。在清理过程中,没有标记的对象将被释放,不会发生任何复制动作。所以剩下的空间是不连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。

    三、综述

    “停止-复制”的意思是这种垃圾回收动作不是在后台进行的;相反,垃圾回收动作发生的同时,程序将会被暂停。在sun公司的文档中会发现,许多参考文献将垃圾回收视为低优先级的后台进程,但事实上垃圾回收器在sun公司早期版本的java虚拟机中并非以这种方式实现的。当可用内存数量较低时,sun版本的垃圾回收器会暂停运行程序,同样,“标记-清扫”工作也必须在程序暂停的情况下才能进行。

    如前文所述,在这里所讨论的java虚拟机中,内存分配以较大的“块”为单位。如果对象较大,它会占用单独的块。严格来说,“停止-复制”要求在释放旧有对象之前,必须先把所有存活对象从旧堆复制到新堆,这将导致大量内存复制行为。有了块之后,垃圾回收器在回收的时候就可以往废弃的块里拷贝对象了。每个块都用相应的“代数”来记录他是否还存活。通常,如果块在某处被引用,其“代数”会增加;垃圾回收器将对上次回收动作之后新分配的块进行整理。这对处理大量短命的临时对象很有帮助。垃圾回收器会定期进行完整的清理动作——大型对象仍然不会被复制(只是其代数会增加),内含小型对象的块则被复制并整理。java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式;同样java虚拟机会跟踪“标记-清扫”的效果,要是对空间出现很多碎片,就会切换回“停止-复制”方式。这就是“自适应”技术。(自适应的、分代的、停止-复制、标记-清扫式垃圾回收器)

    四、其他文章

    看了一篇讲解详细的文章,与上面写的机制能够对应起来,可以看一下,能够清楚常用的jvm的详细的各种垃圾回收方式。http://www.cnblogs.com/zhguang/p/3257367.html#commentform

转载于:https://my.oschina.net/u/1760932/blog/665514

java GC垃圾回收相关推荐

  1. 不要再问我“Java GC垃圾回收机制”了

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底 ...

  2. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  3. Java GC垃圾回收机制

    Java提供了gc机制,jvm 中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 jav ...

  4. java gc会回收类么_Java GC 垃圾回收机制

    一.Java GC是什么? Java垃圾回收是对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver ...

  5. jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

    jvm gc(垃圾回收机制) Java JVM  垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程) 作者:知乎用户 链接:https://www.zhihu.c ...

  6. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

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

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

  8. java如何关闭gc,GC垃圾回收机制,

    GC垃圾回收机制, 个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里 ...

  9. java对于垃圾回收机制[GC垃圾回收机制] 为什么有GC还会有内存溢出呢?

    java垃圾回收机制 来源于书本和工作中的总结. 内存泄露 如果分配出去的内存得不到释放,及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这就是内存泄露 GC机制 java内存分配和回收 都是j ...

最新文章

  1. xunsearch 迅搜初探
  2. (27) java web的struts2框架的使用-基于表单的多文件上传
  3. 万字长文了解模拟退火算法原理及求解复杂约束问题(源码实现)
  4. node模块函数图解
  5. outofmemory异常如何解决?
  6. 腾讯云服务器配置ftp~
  7. Oracle 18.3 : 透过告警日志从安装初始化过程看 18c 的新改变
  8. 你怎么可以不了解 AST 呢?
  9. json输出count如何计算_基于 Kafka + Flink + Redis 的电商大屏实时计算案例
  10. 高分辨率图片导入unity模糊问题
  11. 生成PDF文件的几种方法
  12. Nginx Window假死状态
  13. Mybatis自定义轻量级分页组件(易集成,易拓展)
  14. PROGRESSIVE GROWING OF GANS FOR IMPROVED QUALITY, STABILITY, AND VARIATION(PGGAN)
  15. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:基于模糊综合评价和灰色关联度的淡水养殖池塘水华分析、预测及净化模型(附一等奖获奖论文和matlab代码)
  16. HTML语义化标签理解
  17. VS快捷键,常用加粗
  18. RocketMQ学习笔记(持续更新)
  19. Nacos -- 下载、安装
  20. 使用PP-TTS实现语音合成

热门文章

  1. Android 版本对于 API
  2. 异构GoldenGate 12c 单向复制配置
  3. MongoDB:The Definitive Guide CHAPTER 2 Getting Started
  4. Flash Player版本相关问题
  5. linux搜索一天内更新的所有文件,linux下怎样更新文件夹下所有文件的时间戳
  6. CGAffineTransform 放射变换
  7. Android 百度地图开发(三)--- 实现比例尺功能和替换自带的缩放组件
  8. google 地图 V3 运动轨迹
  9. jquery选择器的总结
  10. generator异步