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

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

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

垃圾收集器算法

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

 

(1)引用计数收集器

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

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

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

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

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

 

(2)跟踪收集器

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

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

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

 

(3)拷贝收集器

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

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

 

(4)按代收集的收集器

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

 

(5)自适应收集器

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

 

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

 

参考:《深入java虚拟机》

目录
相关文章
|
12月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
986 55
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1926 35
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
266 3
|
12月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
558 0
|
7月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
7月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
11月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
801 58
|
10月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
460 5
|
10月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
546 1