1.引用计数:

  每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1,当引用离开作用域或被置为null时,引用计数减1.

  缺陷:在对象循环引用时,存在“对象应该被回收,引用计数却不为0”的情况。

  常用来说明垃圾收集的工作方式,当没有被任何Java虚拟机应用。

2.基于:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区域中的引用的思想。从堆栈或静态区域开始,遍历所有的引用,就能找到所有活着的对象。

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

  (1)停止-复制(stop-and-copy):先暂停程序运行(所以不属于后台回收模式),然后将所有的存活对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑。

  当一个对象从一处被搬到另一处,所有指向它的引用都得修改,位于堆或静态存储区域的引用可以直接被修正,但可能还有其他指向这些对象的引用,它们在遍历的过程中才能被找到。

  缺陷:效率低。a.两个堆来回倒腾,需要维护比实际多一倍的空间。某些虚拟机对此处理的方式是,按需从对中分配几块较大的内存,复制动作发生在这些较大块的内存之间。b.复制,程序稳定后,可能只有少量或者没有垃圾,复制式回收器仍然会复制,这相当浪费。为避免这种情形,一些虚拟机会进行检查:没有新垃圾产生时,转到另一种工作模式(即自适应)。

  (2)标记-清除(mark-and-sweep),当找到活的对象时,给存活对象设一个标记,这个过程中不会回收任何对象。当全部标记工作完成时,清理动作才会开始。清理过程中,没有被标记的对象将被释放,标记对象不会复制。(速度慢,但只有少量垃圾甚至没有垃圾时,速度很快)

  以上两种方式都必须在程序暂停的情况下才能进行。

3.自适应技术:

  Java虚拟机中,内存分配以较大的块为单位,如果对象较大,它会占单独的块,“停止-复制”有了块以后,垃圾回收器在回收的时候就可以往废弃的块里拷贝对象。每个块都有相应的代数(generation count)来记录是否存活。通常块在某处被引用代数就会增加,回收器对上次回收动作之后新分配的块进行整理。这对处理大量的短命 的临时对象很有帮助。垃圾回收器会定期进行完整的清理工作-大型对象不会被复制(只是其代数会增加),内含小型对象的那些块则被复制并整理。Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低,就切换到“标记-清除”方式;同样,Java虚拟机会跟踪“标记-清除”的效果,要是对空间出现很多碎片,就会切换回“停止-复制”方式。

转载于:https://www.cnblogs.com/law-luffy/p/5498167.html

think in Java 第五章之垃圾回收类型相关推荐

  1. 第十五章: 菱悦 -垃圾回收GC详解

    第 15章 垃圾回收GC详解 文章目录 第 15章 垃圾回收GC详解 1.System.gc() 的理解 1.1.System.gc() 方法 1.2.不可达对象回收行为 2.内存溢出与内存泄漏 2. ...

  2. 第十五章:垃圾回收相关算法

    标记阶段:引用计数算法 循环引用 举例 小结 标记阶段:可达性分析算法 概念 思路 GC Roots可以是哪些? 总结 小技巧 注意 对象的finalization机制 注意 生存还是死亡? 具体过程 ...

  3. 尚学堂Java第五章所有题目

    尚学堂Java第五章所有题目 一.选择题 二.简答题 三.编码题 编码题一 编码题二 编码题三 这次的作业有一部分理解的可能不是很透彻,可能不是最优的方法,希望师傅们能给刚入门的我一点建议! 一.选择 ...

  4. 【趣话编程】一个Java对象的回忆录:垃圾回收

    简介:趣话编程第三期,今天让我们一起去看看一个Java对象的回忆录:垃圾回收. 原文链接 对象的诞生 "你醒啦!",迷迷糊糊中听到一个声音,我睁开了眼睛,发现一个小伙伴正看着我. ...

  5. JVM实用参数(五)新生代垃圾回收

    原文链接  作者: PATRICK PESCHLOW :译者:严亮 本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation).首先我们会讨论为什么调整新生代的参数会 ...

  6. 编写高性能 .NET 代码 第二章:垃圾回收 基本操作

    基本操作 垃圾回收的算法细节还在不断完善中,性能还会有进一步的提升.下文介绍的内容在不同的.NET版本里会略有不同,但大方向是不会有变动的. 在.net进程里会管理2个类型的内存堆:托管和非托管.本地 ...

  7. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  8. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

  9. 速学堂 JAVA 第五章练习

    速学堂 JAVA300 第五章练习 一.选择题 1.使用权限修饰符(B)修饰的类的成员变量和成员方法,可以被当前包中所有类访问,也可以被它的子类(同一个包以及不同包中的子类)访问.(选择一项) A.p ...

最新文章

  1. 北斗报文php,北斗卫星一代短报文通信技术
  2. JS 监控页面刷新,关闭 事件的方法(转载)
  3. c语言二分法查找次数,二分法查找
  4. linux网络配置及IP绑定
  5. 玩具租赁到底在解决用户什么痛点?
  6. C++基础与深度解析第二章:对象与基本类型
  7. 分窗 Gram-Schmidt 高光谱降维的 水稻纹枯病检测
  8. KVO 的使用和举例
  9. linux软盘镜像下载,软盘镜像Image文件制作(WinImage Pro)
  10. 批量word转pdf——VBS脚本,在office宏中运行即可
  11. SpringCloud OpenFeign调用第三方服务
  12. Axure知识点:如何制作输入关键词模糊搜索功能?
  13. 用计算机弹音乐的歌谱《奇迹再现》,奇迹再现曲谱_奇迹再现的歌谱
  14. maven profiles勾选不了
  15. odoo 中的 domian 和 运算符
  16. Cadence 应用注意事项--转载
  17. PSO粒子群算法微电网优化调度(微电网孤岛运行优化调度)matlab程序
  18. 图灵、图灵机和图灵测试
  19. 【A-SOUL】嘉然 MMD模型下载
  20. ipxe无盘服务器,ipxe uefi pxe HTTP启动文件及启动菜单的个人体会

热门文章

  1. [C++再学习系列] 函数模板和类模板
  2. ASP.NET 2.0在SQL Server 2005上自定义分页
  3. else 策略模式去掉if_设计模式(三)——简单的状态模式代替if-else
  4. react入门代码_如何在React中构建温度控制应用程序-包括提示和入门代码
  5. monorepo_Monorepo开发的要点
  6. saltstack实现haproxy+keepalived负载均衡+高可用(二)
  7. 利用spring aop统一处理异常和打日志
  8. 【网络流24题】最小路径覆盖问题
  9. 解决Office互操作错误检索COML类工厂中 CLSID为 {xxx}的组件时失败,原因是出现以下错误: 80070005...
  10. mysql select * f