jvm——初入垃圾回收

267 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

什么是垃圾回收?

垃圾收集叫做 Garbage Collection 简称 GC,在没有认真了解GC的时候一直以为GC是因为java语言而产生。
事实上垃圾收集的历史远远比java久远,最早可以追溯到1960年诞生于麻省理工学院的Lisp语言,它是第一门使用内存动态分配垃圾收集的语言。

垃圾收集需要考虑个事情:
1、哪些内存需要回收?
2、什么时候回收?
3、如何回收?

如何判断对象是否可以回收?

引用计数法

引用计数是指只要一个对象被其它变量所引用,那么让这个对象的引用加一,被引用了两次就会加二,如果不再被引用了就会在它的引用次数上减一。

当这个对象的引用计数为零的时候表示没有人进行引用它了,就可以认为该对象为垃圾可以进行回收。

循环引用时候会造成内存泄漏,python早期就是用的引用计数算法,jvm并没有采用该算法,而是采用下面这个算法。

可达性分析算法

先了解一个名词 根对象,它是指一些肯定不能被当作垃圾回收的对象称之为根对象

在垃圾回收之前会对中的所有对象进行一遍扫描,然后判断堆中的对象是否被根对象直接或者间接的被引用。如果是那么这个对象就不能被回收,如果这个对象没有被根对象直接或者间接的引用,那么它将来就可以进行回收。

可以这么理解:比如在水果店买阳光玫瑰葡萄的时候,我们提起它的根部,可以食用的新鲜果肉会跟随着提起的动作带起来,而不新鲜的果肉就会掉落,那么这些掉落的果肉就可以当作垃圾进行回收。