JAVA虚拟机垃圾回收算法原理

简介:    除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的。

   除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的。这是因为,堆中没有连续的空闲空间放得下新的对象。

垃圾收集器算法

  任何垃圾回收算法都必须做两件事,首先,它必须检测出垃圾对象。其次,它必须回收垃圾对象所使用的堆空间并还给程序。从根对象开始,任何可以被触及的对象都被认为是“活动的”对象(如果正在运行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的)

 

(1)引用计数收集器

  是垃圾回收的早期策略,在这个方法中,堆中每一个对象都有一个计数器。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数器被置为1。

  当任何其他变量被赋值为对这个对象的引用时,计数加1.

  当一个对象的引用超过了生命期或者被设置一个新的值时,对象的引用计数减1.

      任何引用计数器为0的对象可以被当作垃圾收集。

优点:引用计数器可以交织在程序之中,对于程序不能被长时间打断的实时环境很有利。  缺点:引用计数无法检测出循环(即两个或者更多的对象相互引用)

 

(2)跟踪收集器

  从根节点开始的对象引用图,在追踪过程中遇到的对象以某种方式打上标记。要么在对象本身设置标记,要么用一个独立的位图来设置标记。当追踪结束后,未被标记的对象就知道是无法触及的,从而可以被垃圾回收。

JAVA虚拟机的垃圾收集器可能有对付堆碎块的策略。标记并清除收集器通常使用的两种策略是压缩和拷贝。 其实现原理是快速地移动对象来减少堆碎块。压缩收集器把活动的对象越过空闲区移动到堆的另一端,那么在堆的另一端就出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。(对象的引用实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置。当对象被移动了,只有这个句柄需要被更新为新位置。所有的程序中对这个对象的引用仍然指向这个具有新值的句柄,而句柄本身没有移动。

优点:简化了消除堆碎块的工作。  缺点:每一次对象访问都带来了性能的损失。

 

(3)拷贝收集器

  把所有的活动对象移动到一个新的区域。在拷贝的过程中,它们是紧挨着布置,消除原本它们在旧区域的空隙。对象被快速拷贝到一个新的区域,同时转向指针仍然留在原来的位置。转向指针可以让垃圾收集器发现已经被转移的对象的引用。然后垃圾收集器可以把这些引用设置为转向指针的值,所以它们现在指向对象的新位置。 这个算法的特点是"停止并拷贝"。任何时候都只使用一个区域,对象在同一个区域中分配,直到这个区域被耗尽。此时,程序执行被终止,堆被遍历,遍历时遇到的活动对象被拷贝到另一个区域。当停止和拷贝过程结束,程序恢复执行。

优点:对象可以在从根对象开始的遍历过程中随着发现被拷贝,不再有标记和清除的区分。  缺点:要分配两倍的堆内存,每次都把生命周期很长的对象来回拷贝,消耗大量的时间。

 

(4)按代收集的收集器

  通过把对象的寿命来分组解决拷贝收集器的效率低下的问题。在这个方法里,堆被分为两个或者更多的子堆,每一个子堆为一"代"对象服务。最年幼的那一代进行最频繁的垃圾收集。如果一个最年幼的对象经历了好几次的垃圾回收依旧存活,那么这个对象就成长为寿命最高的一代。被转移到另一个子堆中去。

 

(5)自适应收集器

  自适应算法监视堆中的情形,并且对应地调整为合适的垃圾收集技术。

 

以上垃圾回收机制都会造成程序的中断-运行的过程,并不适用于实时性比较高的系统。

 

参考:《深入java虚拟机》

目录
相关文章
|
2月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
44 0
|
17天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
27 3
|
17天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
46 2
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
58 1
|
2月前
|
监控 算法 Java
Java虚拟机垃圾回收机制深度剖析与优化策略####
【10月更文挑战第21天】 本文旨在深入探讨Java虚拟机(JVM)中的垃圾回收机制,揭示其工作原理、常见算法及参数调优技巧。通过案例分析,展示如何根据应用特性调整GC策略,以提升Java应用的性能和稳定性,为开发者提供实战中的优化指南。 ####
47 5
|
2月前
|
算法 Java 开发者
Java内存管理与垃圾回收机制深度剖析####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,特别是其垃圾回收机制的工作原理、算法及实践优化策略。不同于传统的摘要概述,本文将以一个虚拟的“城市环卫系统”为比喻,生动形象地揭示Java内存管理的奥秘,旨在帮助开发者更好地理解并调优Java应用的性能。 ####
|
1月前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
47 0
下一篇
开通oss服务