使用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. muduo源码解析4-exception类

    exception class exception:public std::exception { }; 作用: 实现了一个异常类,继承于std::exception,主要用于实现打印线程调用栈信息. ...

  2. new操作符创建对象的四个步骤

    new操作符创建对象可以分为以下四个步骤: 创建一个空对象 将所创建对象的__proto__属性值设为构造函数的prototype的属性值 执行构造函数中的代码,构造函数中的this指向该对象 返回对 ...

  3. python数值运算 四则运算

    数值运算 描述 获得用户输入的一个字符串,格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬ ...

  4. MES系统与喷涂设备软件基于文本文件的数据对接方案

    产品在生产过程中除了记录产品本身的一些数据信息,往往还需要记录下生产设备的一些参数和状态,这也是MES系统的一个重要功能.客户的药物支架产品,需要用到微量药物喷涂设备,客户需要MES系统能完整记录下每 ...

  5. Pyinstaller打包: 将资源文件或文件夹打包到最后生成的exe中

    前提:用pyinstaller打包时部分资源文件可以利用qrc转成py文件来读取,但是有部分文件类型不适用. 原理:Pyinstaller 将资源文件一起打包到exe中.当exe运行时,会生成一个临时 ...

  6. Android开发之使一打开activity等界面Edittext获取焦点,弹出软键盘java代码实现

    // 获取编辑框焦点 editText.setFocusable(true); //打开软键盘 IInputMethodManager imm = (InputMethodManager)getSys ...

  7. Android开发之封装log打印日志的工具类,实用logutils详细代码

    public final class LogUtil { /** all Log print on-off */ private final static boolean all = true; /* ...

  8. h5整体页面布局

    只要在每个页面加入这段js他会把每个页面平均分成横向25rem,纵向47rem//页面布局 <script> (function(doc, win) { var docEl = doc.d ...

  9. Android Home

    unity处理Android的home键响应事件 http://blog.csdn.net/tianyongheng/article/details/38459531 Unity3D教程:处理Home ...

  10. Web测试和前端技术

    Html Form表单 用户需要输入内容的地方一般有一个表单元素 method:GET/POST action:要打开/提交的目文件 Table表格 检查表格数据和数据库的一致性 表格的布局检测:填满 ...