最近找工作,被问了2次java垃圾回收机制,答的都不是很好!原先那股刨根问地的劲好像随着年龄的增长也越来越不行了!
以下是thinking in java中关于垃圾回收的一些总结:
java垃圾回收,主要是靠一个低优先级的进程负责回收,注意,不是后台的进程
他的优点是边回收,边调整堆使其紧凑
主要有以下几种算法:
1.引用计数
该算法在java虚拟机没被使用过,主要是循环引用问题,因为计数并不记录谁指向他,无法发现这些交互自引用对象。
怎么计数?
当引用连接到对象时,对象计数加1
当引用离开作用域或被置为null时减1
怎么回收?
遍历对象列表,计数为0就释放
有什么问题?
循环引用问题。
2.标记算法
标记算法的思想是从堆栈和静态存储区的对象开始,遍历所有引用,标记活得对象
对于标记后有两种处理方式
(1)停止-复制
所谓停止,就是停止在运行的程序,进行垃圾回收
所谓复制,就是将活得对象复制到另外一个堆上,以使内存更紧凑
优点在于,当大块内存释放时,有利于整个内存的重分配
有什么问题?
一、停止,干扰程序的正常运行,二,复制,明显耗费大量时间,三,如果程序比较稳定,垃圾比较少,那么每次重新复制量是非常大的,非常不合算
什么时候启动停止-复制?
内存数量较低时,具体多低我也不知道
(2)清除
也称标记-清除算法
也就是将标记为非活得对象释放,也必须暂停程序运行
优点就是在程序比较稳定,垃圾比较少的时候,速度比较快
有什么问题?
很显然停止程序运行是一个问题,只清除也会造成很对内存碎片。
为什么这2个算法都要暂停程序运行?
这是因为,如果不暂停,刚才的标记会被运行的程序弄乱,
(3)分代收集
分代收集是利用程序有大量临时对象的特点,对象每被引用一次,代数就增加,代数小的小型对象会被回收整理,大对象只会代数增加,不会被整理。
优点在于对于处理大量临时的变量很有帮助
(4)自适应
jvm会监测垃圾回收的效率,在(1),(2)算法之间切换。
3.增量收集,
增量回收的主要算法还是分代(Young Objects 回收)与Train算法(Mature Object回收),所谓增量回收的关键问题是如何实现有序的增量回收而不会导致混乱(引用及其的增加与减少),分代可以逐代回收,Train算法可以逐个车厢回收,这样每次一代或每次一厢可以实现短停顿回收。
具体算法可以参见以下文章:
Java HotSpot性能引擎的体系结构
http://blog.csdn.net/youlin/archive/2004/06/30/30574.aspx
Java theory and practice: Garbage collection in the HotSpot JVM
http://www.ibm.com/developerworks/java/library/j-jtp11253/
Incremental collection of mature objects (1992)
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.3883
Incremental Mature Garbage Collection Using the Train Algorithm
http://www.daimi.au.dk/~beta/Papers/Train/train.html
写得都非常棒
4.与垃圾回收相关的主要是System.gc()和finialize()方法。
分享到:
相关推荐
JVM垃圾回收算法总结 垃圾回收算法是Java虚拟机(JVM)中的一种机制,用于回收无用的对象以释放内存空间。垃圾回收算法可以从不同的角度划分,下面是常见的垃圾回收算法: 1. 引用计数(Reference Counting) ...
总结来说,JVM的垃圾回收算法有多种,每种都有其适用场景和优缺点。开发者需要根据应用的需求选择合适的垃圾回收策略,以优化内存管理和提升系统性能。理解这些基础的垃圾回收算法有助于我们更好地调试和调优Java...
第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...
### 各种垃圾回收算法的通俗解读 #### 引用计数算法 **定义与原理:** 引用计数算法是一种非常直观且简单的垃圾回收方法。它的核心思想是为每个对象维护一个引用计数器,每当有一个地方引用了该对象时,计数器就会...
Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...
根据给定文件的信息,我们可以总结出以下相关的IT知识点: ### 1. 文件处理与数据读取 该程序涉及到了文件的打开、读取以及关闭等基本操作,这在实际编程中非常常见。例如,在`Init()`函数中通过`fopen()`函数打开...
GC总结
### JAVA垃圾回收个人总结 ...通过理解不同的垃圾回收算法及其优缺点,开发者可以选择合适的垃圾回收策略来优化应用程序的性能。随着Java虚拟机技术的发展,未来的垃圾回收机制将会更加高效、智能。
总结,JVM的垃圾回收算法是一个复杂且精细的过程,涉及到多方面的技术,如根节点枚举、安全点/区域的确定、记忆集和卡表的使用,以及优化GC性能的低延迟策略。理解这些细节有助于更好地理解和优化Java应用的内存管理...
三、垃圾回收算法 1. 标记-清除:分为标记和清除两个阶段,标记所有存活对象,然后清除所有未标记的对象。缺点是会产生大量内存碎片。 2. 复制算法:将内存分为两块,每次只使用其中一块,当一块满时,将存活对象...
通过深入理解JVM内存模型以及不同的垃圾回收算法,可以帮助我们更好地优化程序性能,提高代码质量。在实际开发过程中,合理利用JVM提供的工具和技术,可以有效地避免内存泄漏等问题,提升系统的稳定性和可靠性。
总结来说,基于页合并更新的NAND_Flash垃圾回收算法是提升NAND闪存系统性能的关键技术,它通过精细化的数据管理策略,减少了不必要的数据迁移,降低了对存储单元的损耗,从而提高了SSD的稳定性和耐用性。对于理解和...
"如何回收"涉及到多种垃圾回收算法。早期的引用计数器法由于不能处理循环引用问题,因此在现代Java虚拟机中并不常用。主流的算法是标记清除和复制算法的变种。 1. 标记清除算法:首先标记出所有活动对象,然后清除...
Tracing算法是目前广泛使用的垃圾回收算法之一,它通过追踪从根集(root set)出发可达的对象来确定哪些对象仍然有效。根集通常包括当前栈中的局部变量、静态变量以及常量池中的引用等。 该算法的过程如下: - 从...
Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...
大部分新创建的对象首先被分配到Eden区,经历第一次垃圾回收后,存活下来的对象会转移到Survivor区。 - 老年代存放生命周期较长的对象,当新生代的空间不足以容纳新对象或者Survivor区的对象达到一定年龄时,它们...
不同的区域使用不同的垃圾回收算法,新生代通常使用复制算法,老年代通常使用标记-清除或者标记-整理算法。 垃圾回收是一个复杂的过程,涉及到许多细节和权衡,不同的垃圾回收器会有不同的实现和策略。在实际应用中...
1. **GC Roots Tracing(根搜索算法)**:这是一种常用的垃圾回收算法,用于确定哪些对象是可达的,从而间接确定哪些对象可以被视为垃圾。在Java中,GC Roots主要包括: - 在VM栈(栈帧中的局部变量表)中的引用。 ...