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

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

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

垃圾收集器算法

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

 

(1)引用计数收集器

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

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

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

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

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

 

(2)跟踪收集器

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

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

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

 

(3)拷贝收集器

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

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

 

(4)按代收集的收集器

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

 

(5)自适应收集器

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

 

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

 

参考:《深入java虚拟机》

目录
相关文章
|
21天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
57 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
16天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
35 3
|
5天前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
10天前
|
存储 Dart Java
Dart 虚拟机运行原理
【10月更文挑战第20天】Dart 虚拟机通过一系列复杂的机制和操作,确保 Dart 代码能够准确、高效地执行。它为 Dart 语言的广泛应用提供了坚实的基础和可靠的运行环境
17 6
|
10天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
11天前
|
算法 数据库 索引
HyperLogLog算法的原理是什么
【10月更文挑战第19天】HyperLogLog算法的原理是什么
15 1
|
17天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
52 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
16天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
17天前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
21 0
|
17天前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
20 0