`

JVM垃圾回收历史

    博客分类:
  • java
jvm 
阅读更多
从网上看到一篇文章讲述垃圾回收的历史搬运过来:

为什么要有GC

我时而听到C++程序员说我们是被GC惯坏了的一代。的确是这样的,我本人在学习GC算法时,大脑里第一问题就是为什么需要GC这样的东西。说明我已经认为GC是理所当然了。

总的一句话:没有GC的世界,我们需要手动进行内存管理,而手动内存管理是纯技术活,又容易出错。

既然我们写的大多程序都是为了解决现实业务问题,那么,我们为什么不把这种纯技术活自动化呢?但是自动化,也是有代价的。 这是我的个人理解,不代表John McCarthy本人的理解。

“垃圾”的定义

首先,我们要给个“垃圾”的定义,才能进行回收吧。书中给出的定义: > 把分配到堆中那些不能通过程序引用的对象称为非活动对象,也就是死掉的对象,我们称为“垃圾”。

GC的定义

因为我们期望让内存管理变得自动(只管用内存,不管内存的回收),我们就必须做两件事情: > 1. 找到内存空间里的垃圾 > 2. 回收垃圾,让程序员能再次利用这部分空间 [1] 只要满足这两项功能的程序,就是GC,不论它是在JVM中,还是在Ruby的VM中。

但这只是两个需求,并没有说明GC应该何时找垃圾,何时回收垃圾等等更具体的问题,各类GC算法就是在这些更具体问题的处理方式上施展手脚。

GC的历史

John McCarthy身为Lisp之父和人工智能之父,同时,他也是GC之父。1960年,他在其论文中首次发布了GC算法(其实是委婉的提出)。

标记-清除算法 由John McCarthy在1960年提出
引用计数法 由George E. Collins在1960年提出 此算法会有循环引用问题,Harold McBeth 1963年指出。
复制算法 由Marvin L. Minsky在1963年提出
《垃圾回收》的作者认为:

从50年前GC算法首次发布以来,众多研究者对其进行了各种各样的研究,因此许多GC算法也得以发布。[2] 但事实上,这些算法只不过是把前文中提到的三种算法进行组合或应用。也可以这么说,1963年GC复制算法诞生时,GC的根本性内容就已经完成了。[3]
那我们常常听说的分代垃圾回收又是怎么回事?作者是这样说的: > 人们从众多程序案例中总结出了一个经验:“大部分的对象在生成后马上就变成了垃圾,很少有对象能活得很久”。分代垃圾回收利用该经验,在对象中导入了“年龄”的概念,经历过一次GC后活下来的对象年龄为1岁。[4]

分代垃圾回收中把对象分类成几代,针对不同的代使用不同的GC算法,我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。[5]
好了,这下我总算知道为什么要分代了,我的总结是: 将对象根据存活概率进行分类,对存活时间长一些的对象,可以减少扫描“垃圾”的时间,以减少GC频率和时长。根本思路就是对对象进行分类,才能针对各个分类采用不同的垃圾回收算法,以对各算法进行扬长避短。
分享到:
评论

相关推荐

    JVM历史发展和内存回收笔记

    JVM历史发展和内存回收笔记

    JVM简介以及历史.docx

    (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。 (3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09  第35讲 垃圾回收算法-标记清除算法 00:04:36  第36讲 垃圾回收算法-复制算法 00:14:35  第37讲 垃圾回收算法-标记整理算法和分代收集...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-复制算法00:14:35分钟 | 第37节垃圾回收算法-标记整理算法和分代收集...

    JAVA复习题库.pdf

    1. Java 语言的垃圾回收机制是指 JVM 中的垃圾回收器,它可以自动回收无用的对象。 2. 垃圾回收机制可以避免内存泄露和溢出。 第四部分:Java 语言的安全性 1. Java 语言的安全性是指 Java 语言的访问权限控制。 2...

    jprofiler的使用及联调内存溢出解决方案交流

    VM 遥感勘测是 jprofiler 的第四个主要功能,它可以观察 JVM 的内部状态,提供堆、记录的对象、垃圾回收、类、线程等视图。 在解决内存溢出问题时,jprofiler 可以提供重要的帮助。内存溢出是指计算机程序在运行时...

    Java Heap Cleaner:简单的函数清理,在运行时,Java堆内存,从而防止java OutOfMemory错误-matlab开发

    Java 代码重新初始化一些负责内存泄漏的 JVM 类,然后强制进行垃圾回收。 重新初始化的 Java 类是 MATLAB 用于显示 wievs(命令历史、当前文件夹等)的类。 安装: 1) 在 [PATH_OF_YOUR_CHOICE] 中解压存档2) 将 ...

    nashorn-presentation:我在Nashorn上的Brighton Java演讲的代码

    Nashorn演示 我是谁? 我是理查德。 感谢The Skiff和...Java是一种相对冗长,垃圾回收,基于类,静态类型,单一调度,具有单一实现继承和多接口继承的面向对象的语言。Sun大声地宣告Java的新颖性。” 1995年-

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。...附录E JDK历史版本轨迹

    Java经典入门教程pdf完整版

    晑性能、可靠的、解释型、自动垃圾回收等特点。 这里只解释一下平台无关和分布式,其余的在后面会逐步接触到 3:平台无关 所谓平台无关指的是:用Java写的程序不用修改就可在不同的软硬件平台上运行。这 烊就能实现同样...

Global site tag (gtag.js) - Google Analytics