温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

垃圾收集机制是什么意思

发布时间:2020-07-09 17:04:58 来源:亿速云 阅读:239 作者:Leah 栏目:编程语言

这期内容当中小编将会给大家带来有关垃圾收集机制是什么意思,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。

在本部分我们要解决如下几个问题:

1、哪些内存需要回收?

2、什么时候回收?

3、如何回收?

哪些内存需要回收?

堆和方法区的内存需要回收,其余的不需要回收。
因为只有堆和方法区是线程共享的,其余的是与线程“同生共死”的,线程结束,内存自然就跟着回收了,所以不用管它们。

什么时候回收?

(1)在堆里面:

当对象“死了”的时候就要对其进行内存回收了。啥叫对象死了?就是没有地方引用它了,它无用了。那怎么判断它是否死了呢?

有两种方法:

引用计数算法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就+1,当引用失效时,计数器的值就-1,当计数器的值为0时,代表此对象已不被引用,也就是“可以死了”。

但这有一个弊端,就是循环引用的问题。就像下图,堆里的两个对象即使无用了也没办法对其进行回收,因为它们互相引用着,计数器的值至少为1。

垃圾收集机制是什么意思

可达性分析

所有生成的对象都是一个称为“GC Roots”的根的子树。从GC Roots开始向下搜索,搜索所经过的路径称为引用链。当一个对象到GC Roots没有任何引用链可以到达时,就称这个对象是不可达的,也就是可以被GC回收了。这个是Java中采用较多的方式。

就像下图中的堆中未被引用的对象,就可以对其进行回收。

垃圾收集机制是什么意思

怎么判断一个对象是否还存在着引用?java中的引用分为4种:

强引用:Object o=new Object(),只要强引用存在,GC永远不会回收掉被引用的对象。

软引用:描述一些还有用但非必需的对象。当系统即将发生内存溢出了,就会对其进行回收。

弱引用:只要进行GC,就会对其进行回收。

虚引用:这是最弱的一种引用关系,无法通过虚引用来取得一个对象实例。它的作用是:能在这个对象被收集器回收时收到一个系统通知。

(2)在方法区里面:

我们知道,方法区里存储的是已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。所以我们在方法区里面进行垃圾回收,回收的是一些废弃的常量和无用的类。

怎么判断一个常量是否被废弃了?

看引用计数就可以,如果没有对象引用该常量,则说明此常量被废弃了,也就可以回收了。

怎么判断一个类是无用的类?

有3种情况:

a、该类所有的实例都已经被回收。

b、加载该类的ClassLoader已经被回收。

c、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如何回收

有4种算法作为理论:
• 标记-清除算法
• 复制算法
• 标记-整理算法
• 分代收集算法

有5种收集器作为实现:

垃圾收集机制是什么意思

后记

内存溢出:系统无法再分配出你需要的空间。比如在堆中无法再给新生的对象分配内存了,在栈里栈满了无法再让新栈帧进栈了。

内存泄漏:内存被对象占用着不还,就叫内存泄露。

上述就是小编为大家分享的垃圾收集机制是什么意思了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm
AI