使用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. 操作系统-存储管理(5)IA-32/Linux的地址转换

    IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...

  2. 团队作业4:第三篇Scrum冲刺博客(歪瑞古德小队)

    目录 一.Daily Scrum Meeting 1.1 会议照片 1.2 项目进展 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 Code Review 记录 3.3 issue ...

  3. 阿里巴巴Java开发手册1.4.0

    链接:https://pan.baidu.com/s/16kKzcRcu20SMDdydMm9ZUw 提取码:p9ef

  4. [CSP-S2019]Emiya 家今天的饭 题解

    CSP-S2 2019 D2T1 很不错的一题DP,通过这道题学到了很多. 身为一个对DP一窍不通的蒟蒻,在考场上还挣扎了1h来推式子,居然还有几次几乎推出正解,然而最后还是只能打个32分的暴搜滚粗 ...

  5. Qt QTranslator 实现多语言转换

    1.在*.pro文件里面添加TRANSLATIONS += English.tsChinese.ts根据自己想要添加多少种语言和什么语言视情况添加. 2.a.通过qt ui设计师添加的文字 首先记得选 ...

  6. python练习 - 文本的平均列数+CSV格式清洗与转换

    文本的平均列数 描述 打印输出附件文件的平均列数,计算方法如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬ ...

  7. Python协程之asyncio

    asyncio 是 Python 中的异步IO库,用来编写并发协程,适用于IO阻塞且需要大量并发的场景,例如爬虫.文件读写. asyncio 在 Python3.4 被引入,经过几个版本的迭代,特性. ...

  8. 数字电路基础(三)TTL与非门输入端接电压表的示数

    如下图所示,当ui输入低电平,电压表示数为0.3v,当ui输入高电平时,电压表示数为1.4v,分析如下 当ui=0.3 此时VT1导通,电流都从输入端流出,VT1的基极电位被钳位在1.0v(Ub1=0 ...

  9. (Android图片内存优化)Picasso加载图片 教程。。详细版

    Picasso 是 Android 上一个强大的图片下载和缓存库. 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Picasso.with( ...

  10. 跟着尚硅谷系统学习Docker-【day07】

    day07-20200722   p27.dockerfile案例编写-3   第一步:编写父dockerfile DockerFile_20200722_2 FROM centos RUN yum ...