博客
关于我
【转载】Java 对象之死
阅读量:289 次
发布时间:2019-03-01

本文共 1296 字,大约阅读时间需要 4 分钟。

Java垃圾回收机制是Java虚拟机(JVM)中保证内存管理的重要部分。它的核心目标是识别那些不再被使用的对象,并回收它们占用的内存空间。这种机制对保持应用程序的高效运行至关重要。

如何判断对象“无用”?

在JVM中,判断对象是否无用主要通过两种算法:引用计数和根集算法。

引用计数算法

引用计数算法通过为每个对象维护一个引用计数来实现。当引用计数为零时,说明该对象没有被其他对象引用,成为JVM回收的目标。这种算法简单高效,但存在一个明显的缺陷:当对象之间形成闭环引用时,无法通过引用计数判断对象是否无用。例如,对象A引用对象B,对象B再引用对象A,这种情况下引用计数都不会降到零,导致这些对象无法被回收。

根集算法

为了解决引用计数算法的局限性,现代JVM主要采用根集算法。根集算法从GCRoot(如静态变量)开始遍历所有引用关系,找出所有可以被其他对象“到达”的对象。如果某个对象无法被其他对象到达,则它被判定为“无用”,即可被回收。这种算法能够有效处理闭环引用问题,是当前JVM的主要垃圾回收算法。

对象回收之后的内存如何处置?

在垃圾回收完成后,JVM需要对释放的内存进行合理分配。具体的回收算法主要有标记-清除、标记-复制和标记-整理三种。

标记-清除

标记-清除算法的核心步骤是标记所有无用对象,然后清除它们占用的内存。标记过程需要遍历所有对象,找出那些引用计数为零或无法被根集算法遍历到的对象。清除过程则负责将这些标记对象的内存空间重置为零,以供新对象使用。

这种算法简单直接,但存在内存碎片化的问题。由于标记和清除都需要遍历内存空间,效率较低,且难以处理大对象分配。

标记-复制

标记-复制算法通过在内存中划分预留区域来优化垃圾回收过程。在标记阶段,与标记-清除相同;在复制阶段,JVM将正在使用的对象复制到预留区域,之后清除所有不在预留区域内的内存。这种方法有效减少了内存碎片,但需要牺牲一半的内存资源,显然在大多数情况下难以接受。

标记-整理

标记-整理算法结合了标记-清除和标记-复制的优点。标记过程不变,但清除阶段将所有正在使用的对象(标记对象)向内存末端移动,占据一块连续的区域。随后清除所有不在预留区域内的内存。这种方法解决了内存碎片问题,同时也显著降低了垃圾回收的内存占用。

分代混合算法

在现代JVM(如HotSpot TM)中,分代混合算法是主要的垃圾回收策略。该算法将对象按照其生命周期范围划分为新生代和老生代两个区域。新生代对象通常较短生命周期,垃圾回收时采用标记-复制算法;老生代对象生命周期较长,垃圾回收时采用标记-清除或标记-整理算法。

Stop the world

在垃圾回收过程中,JVM需要暂停所有Java线程(Stop the world),以确保GC操作的正确性。这是因为引用关系的快照是基于某一时刻的状态,随时间推移可能发生变化。JVM通过OopMap数据结构记录引用关系,确保垃圾回收过程的准确性。

频繁的Stop the world操作会对应用程序性能产生显著影响。如何在内存使用和性能之间找到平衡点,是开发者需要重点关注的问题。

转载地址:http://bcqx.baihongyu.com/

你可能感兴趣的文章
Python基础学习参考(五):字符串和编码
查看>>
Python基础学习
查看>>
python基础变量之---集合
查看>>
python基础变量之---字典
查看>>
python基础变量之---列表
查看>>
python基础变量之---元组
查看>>
python基础内容_Python基础入门必须了解的
查看>>
Python基础之面向对象2(封装)
查看>>
Python在def函数中使用for循环
查看>>
Python图像处理:从内存加载jpeg
查看>>
python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
查看>>
python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
查看>>
python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
查看>>
Python哪个版本最稳定好用2023.10.19
查看>>
python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
查看>>
Python命名中尾随下划线有什么好处?
查看>>
Python启动脚本
查看>>
python吊打Excel?屁!那是你不会用!
查看>>
Python合并两张图片 | 先叠透明度再合并 (附Demo)
查看>>
python各进制的表述与转换
查看>>