深入理解Java垃圾回收机制Java开发Java经验技巧.docVIP

深入理解Java垃圾回收机制Java开发Java经验技巧.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入理解Java垃圾回收机制Java开发Java经验技巧.doc

深入理解Java垃圾回收机制-编程开发技术 深入理解Java垃圾回收机制 原文出处:cnblogs-Sunnier 一、垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内 存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内 存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只 有对象的引用才有“作用域”。垃圾冋收可以有效的防止内存泄露,有效的使用 空闲的内存。 ps:内存泄需是指该内存空间使用完毕Z后未回收,在不涉及复杂数据结构的一 般情况下,Java?的内存泄露表现为一个内存对彖的生命周期超出了程序需要它 的吋间长度,我们有吋也将其称为“对象游离” o 垃圾回收机制中的算法 垃圾回收机制中的算法 Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾 回收算法一般要做2件基木的事情:(1)发现无用信息对象;(2)冋收被无用 对象占用的内存空间,使该空间可被程序再次使用。 1 ?引用计数法(Reference Counting Collector) 1算法分析 引用计数是垃圾收集器屮的早期策略。在这种方法屮,堆屮每个对象实例都有一 个引用计数。当一个对象被创建时,将该对彖实例分配给一个变量,该变量计 数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1 G?二?b,则 b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期 或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的 对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对 象实例的引用计数器减1。 2优缺点 优点: 引用计数收集器可以很快的执行,交织在程序运行小。对程序需要不被长时间打 断的实时环境比较有利。 缺点: 无法检测出循环引用。如父对象有一个对了对象的引用,了对象反过來引用父对 象。这样,他们的引用计数永远不可能为0. 1.3引用计数算法无法解决循环引用问题,例如: public class Main { public static void main(String[] args) { MyObject objectl = new MyObject(); MyObject object2 = new MyObject(); objectl.objcct = objcct2; object2.object = objectl; objectl 二 null; object2 二 nul1; } } 最后面两句将objectl和object2赋值为null,也就是说objectl和object2 指向的对象已经不可能再被访问,但是rtr丁它们互相引用对方,导致它们的引用 计数器都不为0,那么垃圾收集器就永远不会冋收它们。 tracing 算法(Tracing Collector)或?标记-清除算法(mark and sweep) 1根搜索算法 GC Root ObjDObjE ObjD ObjE 根搜索算法是从离散数学屮的图论引入的,程序把所冇的引用关系看作一张图, 从一个节点GC ROOT -7T-始,寻找对应的引用节点,找到这个节点以后,继续寻找 这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是 没有被引用到的节点,即无用的节点。 java中可作为GC Root的对象有 1 ?虚拟机栈屮引用的对象(本地变量表) 方法区中静态属性引用的对彖 ?方法区中常量引用的对象 本地方法栈中引用的对象(Native对象) 2. 2tracing算法的示意图 空闲表根令空闲表根集合扫描整个空间并清除空闲舉 空闲表 根 令 空闲表 根集合 扫描整个空间并清除 空闲舉 2. 3标记-清除算法分析 标记-清除算法采用从根集合进行扫描,对存活的对象对象标记,标记完毕后, 再扫描整个空间中未被标记的对象,进行回收,如上图所示。标记-清除算法不 需要进行对象的移动,并月?仅对不存活的对象进行处理,在存活对彖比较多的情 况下极为高效,但由于标记-清除算法直接冋收不存活的对彖,因此会造成内存 碎片。 compacting算法 或?标记-整理算法 环用 ▼空闲指针 ABC 根集合根集合翳鼬勰并清除根集合A 根集合 根集合 翳鼬勰并清除 根集合 A C 空闲指针 标记-整理算法采用标记-清除算法--样的方式进行对象的标记,但在清除吋不 同,在回收不存活的对象占用的空间后,会将所冇的存活对象往左端空闲空间移 动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了 对彖的移动,因此成本更高,但是却解决了内存碎片的问题。在基F Compacting 算法的收集器的实现中,一般增加句柄和句柄表

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档