Java虚拟机的垃圾回收机制

Java虚拟机的垃圾回收机制

Java语言会对程序运行过程中产生的垃圾进行自动回收,不需要我们手动地写语句主动地对垃圾进行回收。

什么是垃圾?

在C语言中不再被使用的内存空间被称为垃圾,因为在C语言中如果我们使用到一些自定义类型的结构体,我们就需要自己手动地开辟内存空间,例如:假设自定义类型的结构体名称叫做Node

Node* p = (Node*)malloc(10*sizeof(Node));// 意思为开辟10个内存大小为Node类型的空间,并将开辟成功的空间的首地址进行返回

当我们对这个结构体使用完并且确保不会再次被使用后,就需要使用free函数将开辟的内存空间给释放掉,如果不进行手动地释放,那么手动开辟的空间就会一直占用内存,最终有可能导致内存溢出。

在Java语言中不再被任何引用所指向的对象被称为垃圾,这也是非常容易理解的,因为我们在对对象进行创建时,就需要给出一个对象引用变量用于指向我们在堆内存中创建的对象,所以如果一个对象没有被任何引用变量所指向的话,那么我们也就获取不到对象,也就没有办法对对象进行操作,这个对象自然就成了垃圾。

为什么需要回收垃圾?

由于垃圾会占用一定的内存空间,如果不对垃圾进行回收就会导致内存中存在越来越多的垃圾,使得内存空间溢出,所以需要对垃圾进行回收。

Java虚拟机中的垃圾回收机制,我们需要先找到垃圾,然后才能对垃圾进行回收。

由于垃圾是指不再被任何引用所指向的对象,所以垃圾回收的区域在堆内存中

垃圾回收算法

垃圾标记阶段算法

使用垃圾标记阶段算法,需要在堆内存中通过某些算法找出哪些对象已经成为了垃圾

引用计数算法

堆内存中创建对象的对象头中存在int类型的counter计数器,当存在引用指向对象时,计数器加1,当引用不再指向对象时计数器减1,当计数器中的值为0时,表示该对象没有被任何引用所指向,该对象就成为了垃圾,Java虚拟机在进行垃圾回收时就会根据counter计数器的值进行判断对象是否为垃圾。

引用计数算法判断对象是否为垃圾时比较方便快捷只是根据计数器中的值进行判断,但是会在每个对象的对象头中添加属性占用额外的空间,并且引用变量每一次指向对象都需要对对象的属性进行更新操作,占用大量的时间。

循环引用问题

循环引用是指存在两个或两个以上的对象中的变量互相指向其他对象,例如存在A类对象拥有B类型的成员变量,B类对象拥有A类型的成员变量,如下代码所示。

public class A {

public B b;

}

public class B {

public A a;

}

首先创建A,B两个对象a,b,然后给对象中的成员变量进行赋值。

A a = new A();

B b = new B();

a.b = b;

b.a = a;

这就是循环依赖,对象之间的变量相互指向其他对象,如下图所示。

但是为什么会说循环依赖存在问题呢?

可达性分析算法

相关推荐
沐浴露z8 分钟前
一张思维导图理清【操作系统】
java·linux·网络
2501_9167665413 分钟前
【Springboot】主配置文件
java·spring boot·后端
u***096429 分钟前
后端服务熔断降级策略,错误率阈值 什么是服务熔断降级
java·开发语言
烤麻辣烫31 分钟前
23种设计模式(新手)-3接口隔离原则
java·开发语言·学习·设计模式·intellij-idea
程序猿_极客40 分钟前
【2025最新】 Java 入门到实战:数组 + 抽象类 + 接口 + 异常(含案例 + 语法全解析+巩固练习题)
java·开发语言·后端·java基础·java入门到实战
v***43171 小时前
spring.profiles.active和spring.profiles.include的使用及区别说明
java·后端·spring
艾莉丝努力练剑1 小时前
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set
java·c++·stl·哈希算法·散列表·平衡二叉树·哈希
Moe4881 小时前
@SpringBootApplication 注解(Spring Boot 自动配置)详解
java·后端
后端小张2 小时前
【JAVA 进阶】SpringBoot 事务深度解析:从理论到实践的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·事务
合作小小程序员小小店2 小时前
web网页开发,在线%宠物销售%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·数据库·mysql·jdk·intellij-idea·宠物