GC时根可达算法那些是根节点gcroot

可达性算法是垃圾收集器判断Java对象是否存活的关键,它通过GCRoots作为起点进行遍历。GCRoots包括虚拟机栈、方法区的类静态属性和常量引用、本地方法栈中的JNI引用。如果对象无法从这些根节点达到,则认为对象可回收。这个过程对于有效管理堆内存至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在主流的jdk都采用了gcroot算法,那么哪些可以作为 GC Roots;


jvm中判断对象是否清理的一种方法是可达性算法.

可达性算法就是采用GC Roots 为根节点, 采用树状结构,向下搜索.如果对象直接到达GC Roots ,中间没有任何中间节点.则判断对象可回收. 而堆区是GC的重点区域,所以堆区不能作为GC roots

因为可达性算法的特性,所以可以在gc接触不到的地方作为GC Roots

1.虚拟机栈(栈帧中的本地变量表)中引用的对象;

2.方法区中的类静态属性引用的对象;

3.方法区中常量引用的对象;

4.本地方法栈中JNI(即一般说的Native方法)中引用的对象
 

### GC垃圾回收机制的工作原理 GC(Garbage Collection)是一种自动化的存储管理技术,其核心目标是识别并释放那些不再使用的对象所占据的内存空间。这一过程可以显著降低开发人员手动管理内存的压力,并减少因错误操作而导致的潜在问题。 #### 1. 对象可达性分析 为了判断哪些对象是可以被回收的,GC通常会采用一种名为 **“搜索算法”** 的方法来追踪存活的对象。该算法从一组被称为 “GC Roots”的节点出发,沿着引用链向下遍历所有可到达的对象。这些对象被认为是仍然活跃的,而无法访问到的对象则会被标记为垃圾[^1]。 常见的GC Root包括但不限于: - 虚拟机栈中局部变量表内的引用; - 方法区类静态属性中的引用; - 运行常量池中的引用; - 本地方法栈中的JNI引用。 #### 2. 垃圾收集策略 不同的垃圾回收器可能采取多种方式执行实际的清理工作,以下是几种主流的技术: ##### (1) 标记清除法 此方法分为两个阶段:“标记”,即找出所有的废弃对象;以及“清除”,即将它们移除。然而这种方法存在碎片化的问题,因为删除后的空闲区域可能是不连续的[^2]。 ```python def mark_and_sweep(gc_roots, objects): marked = set() def mark(obj_id): if obj_id not in marked and is_reachable_from_root(obj_id, gc_roots): marked.add(obj_id) for ref_obj_id in get_referenced_objects(obj_id): mark(ref_obj_id) for root in gc_roots: mark(root) # 清理未标记的对象 sweep([obj for obj in objects if obj.id() not in marked]) ``` ##### (2) 复制算法 复制算法将可用内存划分为大小相等的两部分,在每次分配新对象只使用其中一部分。当这部分满了之后,则把还存活着的数据拷贝至另一侧,并一次性擦掉原来位置上的全部内容。尽管效率较高,但它浪费了一半的空间作为代价。 ##### (3) 标记整理法 这是对前两种方案的一种折衷改进措施。它先完成一次常规意义上的标记动作,随后移动剩余项目使之紧密排列在一起从而消除内部间隙现象的发生概率。这种方式既解决了内存分片难题又充分利用了现有容量资源。 #### 3. JVM 中的具体实践 在Java虚拟机(JVM)里,“堆”是最主要发生GC活动的地方。据代际假说理论(Generational Hypothesis),大多数应用程序创建出来的短命实例很快就会变得不可达,因此JVM将其进一步细分成新生代与老年代两大子域来进行更高效的处理。 - 新生代频繁经历Minor GC事件,利用快速但局限性的算法迅速剔除非持久实体。 - 只有少数历经多次筛选依旧健壮下来的个体才会晋升进入老年区间接受Major/Full GC审查流程。 ### 结论 综上所述,GC通过复杂的逻辑体系实现了自动化内存管理功能,极大地简化了软件工程领域里的日常作业难度水平的同提高了系统的稳定性表现形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值