使用JAVA编程时,几乎不需要考虑“内存泄漏”的问题,这也是JAVA相较于C++的一个优点。

最近在看《Java编程思想》(第四版,听说第五版有点牛逼。。。。),里面讲到JAVA的回收机制,在这里记录一下。

书中首先说到的是引用计数:

  这是一种很“简单”,但是速度很慢的垃圾回收技术。这个机制就是说每一个对象都含有一个"引用"计数器,当有”引用“连接到这个对象的时候,计数器就会+1;当”引用“离开作用域,或者被置为null时,计数器就会-1。虽然这个计数器可能不会占用太多的资源(空间),但是这个过程贯穿了程序的真个生命过程。 垃圾回收器会在含有”全部对象“的列表上进行遍历,当发现某一个计数器是0的时候,就释放这个对象占用的空间。这个方法有一些缺陷,当A对象中引用了B对象,A对象的引用消失了,但是此时,程序并不会认为B对象引用也减少了,因而会产生一些”错误“,该被释放掉的没有释放。这种方式也从来没有被任何一种JAVA虚拟机实现。

然后是停止-复制:

  在这个模式认为,任何“活着”的对象,都一定能追溯到它存在于堆栈或者静态存储区的引用。这种模式下,程序会先暂停运行,然后将所有“活着”的对象从当前的堆中,复制到另一个堆。这个时候没有被复制并且放进新堆中的对象,都会被认为是垃圾。在新堆中,这些“活着”的对象是一个挨着一个的,位置紧凑。

  这种方式的效率相对比较低,原因有两个:

  1. 这种复制的方式,需要两个堆,从一个堆复制到另一个堆去,需要的空间就是实际所需空间的一倍了。(有一些JAVA虚拟机在处理这个问题时,会将堆划分成几块较大的内存,复制动作发生在这几个大块之间)
  2. 复制,也是一个问题。当程序稳定运行的时候,垃圾应该是很少的,或者说没有垃圾,但是此时,依然要执行复制,来保证清楚垃圾,不浪费资源。而复制本身就在浪费资源。

最后是标记-清除:

  这个模式的思路就是从堆栈和静态存储区出发,遍历所有的引用,可以找到“活着”的对象。找到“活着”的对象的时候,就会给这些“活着”的对象一个标记,此时暂时不在执行其他动作。当标记工作全部完成之后,清理才会开始。那些没有获得“活着”标记的对象将会被释放。但是这样做,却会造成内存空间的不紧凑,可能内存空间因为一些对象的释放变得不再连续。这个模式也是在程序暂停时才执行的。

  就停止-复制而言,垃圾回收器在回收那些无用对象之前,必须要先将活着的对象拷贝到新的堆中。这里假设内存被分成了多个较大的”块“。则复制行为发生在这些”块“之间,一些大对象会独自占有一个”块“,对于这些大型对象,他们不会被复制,而是他所在的块代数会增加,对于那些小型对象,就使用复制并且释放的方法。当大多数对象都趋于稳定的时候,垃圾回收器还使用这种模式就显的效率很低下,所以这个时候就会切换到标记-清除模式;同样,JAVA虚拟机这个时候也会监控标记-清除模式工作效果,当出现很多破碎的空间时,就切换到停止-复制模式。

  书中称到:这是一种自适应、分代的、停止-复制、标记-清除 式垃圾回收器

关于JAVA的垃圾回收机制的更多相关文章

  1. 记录Java的垃圾回收机制和几种引用

    一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. ...

  2. 了解java中垃圾回收机制

    Java的垃圾回收机制是Java环境自带有的,它不像c语言的malloc申请空间后需要Free()函数来释放,而Java中的代码块中所申请的空间可在程序执行完成后自动释放,但是是有局限性的,代码块所占 ...

  3. 面试官,不要再问我“Java GC垃圾回收机制”了

    Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...

  4. 【Java学习笔记】Java的垃圾回收机制

    搬以前写的博客[2014-12-30 15:07] 以前很少关注内存的问题,基本没有关注,这方面的小白,原因在于自己都是写的自我娱乐的小程序,不关注性能,不是提供服务.而企业级别的应用在程序稳健性方面 ...

  5. JVM系列(三):java的垃圾回收机制

    java垃圾回收机制介绍    上一篇讲述了JVM的内存模型,了解了到了绝大部分的对象是分配在堆上面的,我们在编码的时候并没有显示的指明哪些对象需要回收,但是程序在运行的过程中是会一直创建对象的,之所 ...

  6. JAVA的垃圾回收机制

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

  7. 全面分析Java的垃圾回收机制

    Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarray和mult ...

  8. java JVM垃圾回收机制

    Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...

  9. Java 的垃圾回收机制(转)

    先看一段转载,原文出自 http://jefferent.iteye.com/blog/1123677 虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Gener ...

  10. Java虚拟机垃圾回收机制

    在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...

随机推荐

  1. HTML5实战与剖析之媒体元素

    随着HTML5的到来,flash在手机端全部不能得到支持,这就使一项以flash制作的音乐播放和视频播放只能用HTML5中的媒体标签video标签和audio标签来制作了.很恰巧的是,移动端对HTML ...

  2. Java多线程_JUC包下的阻塞队列

    在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...

  3. vmd与ovito的对比

    1.minimize后,lammps生成的data文件 2.pdb:

  4. 《Head First 设计模式》:外观模式

    正文 一.定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 要点: 外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外 ...

  5. 重拾Java Web应用的基础体系结构

    目录 一.背景 二.Web应用 2.1 HTML 2.2 HTTP 2.3 URL 2.4 Servlet 2.4.1 编写第一个Servlet程序 2.5 JSP 2.6 容器 2.7 URL映射到 ...

  6. Java中的判断实例

    .getClass().getName() 这是最常见的一种判断类型的方法 instanceof 用于判断 对象 是否为某个类的实例 Boolean值 各种is方法 isAnnotationPrese ...

  7. 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成

    1.添加依赖 <!-- MySQL数据库 --> <dependency> <groupId>mysql</groupId> <artifactI ...

  8. IDEA导入Eclipse的快捷键KeyMap

    说在前面的话 现在由于IDEA编辑器越来越火,因此很多程序员都从eclipse转入IDEA,转入后确实发现很强大的编辑器,但是一直为快捷键而忧愁,因为eclipse毕竟跟随了自己好多年了,突然更换编辑 ...

  9. 文件属性及find命令总结

    第1章   文件属性 1.1   文件的属性 1.1.1    查看文件的详细属性       PS:ls查看的文件或目录默认的是按照名字的第一个字母进行正序排序       ls 参数选项: -t ...

  10. [易霖博YCTF]Web WriteUp

    中午队里师傅发到群里的比赛,借来队里师傅账号和队里其他师傅一起做了一下,ak了web,师傅们tql.学到挺多东西,总结一下. rce_nopar 进入题目给出源码: <?php if(isset ...