今天看thinking in java,里面很详细的谈到java垃圾回收器机制,看完后让我对这神秘的区域有一定的了解,特写一些小总结记录下来。

  分两点来说。

  第一点:Object.finalize();方法。finalize()方法是Object类的意味着所有类都可以使用、重写该方法。当对象调用finalize方法后,相当于告诉垃圾回收器:“我是垃圾,在下次垃圾回收的时候可以把我回收”,然后垃圾回收器在下次回收垃圾的时候就把这个对象给回收了,但是在程序运行周期中,垃圾回收器不一定会执行,它一般在虚拟机内存不够的时候才会执行,为什么是这样呢?因为垃圾回收器的执行也消耗资源、性能,而且在程序结束的时候,虚拟机的内存会自动释放归还给内存。当然你也可以显示地调用System.gc();来告诉系统立刻、马上进行垃圾回收,但是不建议这么做,虚拟机总是在最优的时刻调用垃圾回收。很多经验丰富的开发者同时建议:如果不是必须,最好不要使用finalize()。

  第二点:垃圾回收。垃圾回收这个动作实际上做了两件事,1、回收垃圾,释放内存;2、重新排列堆中内容,让内存的分配更高效。

  在程序启动后,java虚拟机在不断地监视着内存情况,如果发现垃圾比较多,对象在堆中排布比较零散,启动第一种模式:停止-复制(stop and copy)。先把“活”的对象找出来,怎样找呢?垃圾回收器检索整个堆,因为引用可能不断关联着引用,所以将堆中的引用整理出一个“脉络图”,没有被引用的就是“死”的对象,接着,程序短时间停止,把“活”的对象从堆A复制到堆B中,一个挨一个排列整齐,现在堆A只剩下“死”的对象了,也就是垃圾,回头把堆A全部清理,这样就完成一次垃圾清理了。

  假设有9个碎片化严重的对象,排布前和排布后对比:

  

  有人可能想到,如果垃圾比较少,对象比较稳定的情况,那么要把所有“活”的对象迁移到另一个堆里,不是很耗费性能吗?就好比一座稳定的大山需要搬迁,工程浩大。对于这种情况,启动第二种模式:标记-清除(mark and clear),同样如上方法整理出“脉络图”,把“死”的对象标记起来,程序短时间暂停,然后垃圾回收器把标记的对象给回收。因为垃圾较少,不会造成内存碎片化太严重,所以这个模式不会对堆中对象重新排布。

浅谈java垃圾回收机制的更多相关文章

  1. 浅谈python垃圾回收机制

    引入 ​ 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...

  2. 浅谈 JavaScript 垃圾回收机制

    github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...

  3. 浅谈c#垃圾回收机制(GC)

    写了一个window服务,循环更新sqlite记录,内存一点点稳步增长.三天后,内存溢出.于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servicestack.ormlite ...

  4. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  5. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  6. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  7. Java垃圾回收机制_(转载)

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  8. 成为Java GC专家(3)—如何优化Java垃圾回收机制

    为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...

  9. java 垃圾回收机制 引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

随机推荐

  1. Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by

    配置php网站的时候,经常会在页首出现Warning: session_start() [function.session-start]: Cannot send session cache limi ...

  2. JS获取渲染后的样式

    一般我们利用element.style.属性来获取CSS的样式,而此方法只能获取标签内的样式,无法获取头部或引入的样式,因此,而我们又需要获取其样式,则我们可以使用:(其中element为标签,pro ...

  3. 深入了解jsonp解决跨域访问

    在这个项目中,我们做的充分利用jsonp这是一个特点跨界,完成简单的单点登录认证和权限控制的统一.道,各有各的优点.各有各的优点,选择什么方式实现全然取决于我们自己或者项目经理的开发经验,对各种框架的 ...

  4. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

  5. 手机新闻网站,掌上移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发

    我们坐在地铁,经常来查看新浪手机新闻,腾讯新闻.或者刷微信看新闻更多功能.你有没有想过如何实现这些目标.移动互联网,更活泼. 因为HTML5到,jQuery Moblie到.今天我用jqm为了给你一个 ...

  6. {{angular.js 使用技巧}} - 基于验证框架的扩展(w5cValidator)

    开场白: angular.js 是谷歌出的前端js MV*框架,我也是今年做 worktile 的时候才开始接触的,起初技术选型的时候还准备使用 backbone(毕竟很多大公司在使用他,而且也是比较 ...

  7. Effective C++(18) 让接口更容易被正确使用,不易被误用

    问题聚焦:     从这个条款开始,我们把注意力转移到软件设计和声明上来,具体的说就是,C++接口的设计和声明.     所谓软件设计,就是以一般习惯的构想开始,演变成细节的实现,最终开发针对性的特殊 ...

  8. iOS基础 - 文本属性Attributes

    NSKernAttributeName: 调整字句 kerning 字句调整 NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字 ...

  9. Webapi备忘-20140109

    r01的翻译系列:http://www.cnblogs.com/r01cn/category/428069.html 接收FROM数据 Webapi接收表单数据,如果有多个数据比如x=1&y= ...

  10. Asp.Net Web Api 与 Andriod 接口对接开发

    Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!   最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用A ...