从网上看到一篇文章讲述垃圾回收的历史搬运过来:
为什么要有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的历史发展 1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初...
总的来说,JVM作为Java语言的核心组成部分,其历史发展、运行时数据区域的管理以及内存回收机制是理解和优化Java应用程序性能的关键。理解这些知识点,有助于开发者编写出更高效、更稳定的代码。
4. 垃圾回收堆:JVM负责内存管理,尤其是对象的生命周期,通过垃圾回收机制自动回收不再使用的对象,避免内存泄漏。 5. 方法区(Method Area):存储类信息,包括常量、字段、方法数据以及构造函数等。 JVM规范由...
常见的调优手段包括调整堆内存大小、设置垃圾回收器(GC)、调整线程堆栈大小、选择合适的垃圾回收策略和参数等。 4. JAVA并发:Java并发编程涉及到多个线程同时运行以提高程序性能,但同时也需要妥善处理线程间...
本次演讲PPT将深入探讨JVM的演进、其体系结构以及垃圾回收(GC)算法等关键知识点。 JVM体系结构 JVM体系结构是指虚拟机的内部构造,包括类加载器(Class Loader)、运行时数据区(Runtime Data Areas)、执行引擎...
- **垃圾回收**:改进了垃圾回收算法,特别是对于大内存应用的支持。 - **堆空间调整**:提供了更多的参数来配置堆的大小和结构。 **3. 类加载与字节码验证** - **模块化支持**:虽然Java SE 7并未完全引入模块化...
首先,需要理解JVM的垃圾回收机制,合理设置JVM启动参数,如堆内存大小、新生代和老年代的分配比例、垃圾回收器的选择等。其次,了解JVM内存溢出和死锁问题的定位与分析方法,以便快速定位问题并解决。另外,架构师...
- **1998年**:JDK 1.2(也被称为Java 2)发布,带来了JIT解释器和混合执行模式,以及更准确的内存管理技术,显著提升了垃圾回收(GC)的性能。 - **2000年**:Hotspot虚拟机作为默认的JVM被集成到了JDK 1.3中,标志...
5. **垃圾收集器**:自动管理内存,回收不再使用的对象,避免内存泄漏。 微软的JVM与Sun/Oracle的JVM在兼容性和性能上可能存在差异。例如,微软的JVM可能针对Windows系统进行了优化,提供更好的性能体验。但这也...
### JVM基础知识详解 #### HotSpot简介 HotSpot作为Oracle(原属SUN)的主要Java虚拟机实现,...HotSpot JVM提供了多种不同的垃圾回收器选项,可以根据应用的具体需求选择合适的垃圾回收策略,以达到最优的性能表现。
第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09 第35讲 垃圾回收算法-标记清除算法 00:04:36 第36讲 垃圾回收算法-复制算法 00:14:35 第37讲 垃圾回收算法-标记整理算法和分代收集...
这个压缩包“JAVA-JVM-全面/发展史/GC.zip”显然包含了关于Java、JVM、垃圾回收(GC)及其历史的深入学习资料,特别是通过“JAVA-笔记.pdf”这样的文档形式。 Java的发展史可以追溯到1991年,由Sun Microsystems的...
1. **Java虚拟机(JVM)**:JVM是Java平台的一部分,它解析和执行Java字节码,提供了内存管理、垃圾回收和安全性等核心功能。 2. **JavaScript**:一种广泛用于Web开发的解释型语言,支持事件驱动、函数式以及基于...
第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-复制算法00:14:35分钟 | 第37节垃圾回收算法-标记整理算法和分代收集...
4. **性能优化**:JVM有一些可配置的参数,例如堆内存大小,垃圾回收策略等,可以根据应用程序的需求进行调整,以获得更好的性能。 5. **跨平台兼容**:尽管JVM的主要目标是实现跨平台兼容性,但在实际操作中,不同...
这种自动内存管理避免了程序员手动内存管理可能导致的问题,且SUN公司的实现中,垃圾回收通常由后台线程执行,以确保程序的连续运行。 JVM的存储区分为常量缓冲池和方法区。常量缓冲池存储类名、方法名、字段名和...
"jvm gc"是Java虚拟机的垃圾收集器,负责自动回收不再使用的内存,以防止内存泄漏。"fullgc"是垃圾收集的一种类型,通常涉及整个堆的清理,可能会导致应用程序暂停,因此其频率和执行时间是优化JVM性能时需要密切...
JVM的垃圾回收机制(Garbage Collection,GC)是其另一大特色,自动清理不再使用的对象,释放内存,避免内存泄漏。 JDK还包括Java编译器(javac),用于将源代码编译成可执行的字节码。此外,还有许多其他实用工具...
2. **安全性**:Java提供了一套相对安全的内存管理机制,例如垃圾回收机制,这有效减少了内存泄漏等问题。 3. **动态优化**:通过热点代码检测和即时编译技术(JIT),Java能够在运行过程中自动优化代码,从而提高性能...