Java学习手册:垃圾回收(GC)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请务必注明出处: https://blog.csdn.net/MaybeForever/article/details/89056636

一、垃圾回收(GC)

在Java语言中,垃圾回收(Garbage Collection,GC) 是一个非常重要的概念,它的主要作用是回收程序中不再使用的内存。为了减轻开发人员的工作,同时增加系统的安全性与稳定性,Java语言提供了垃圾回收器来自动检测对象的作用域,可自动地把不再使用的存储空间释放掉。具体而言,垃圾回收器要负责完成3项任务:分配内存、确保被引用对象的内存不被错误地回收、回收不再被引用的对象的内存空间。

垃圾回收器的存在一方面把开发人员从释放内存的复杂工作中解脱出来,提高了开发人员的生产效率;另一方面,对开发人员屏蔽了释放内存的方法,可以避免因开发人员错误地操作内存而导致应用程序地崩溃,保证了程序的稳定性。但是,垃圾回收也带来了问题,为了实现垃圾回收,垃圾回收器必须跟踪内存的使用情况,释放没用的对象,在完成内存的释放后还需要处理堆中的碎片,这些操作必定会增加JVM的负担,从而降低程序的执行效率。

对对象而言,如果没有任何变量去引用它,那么该对象将不可能被程序访问,因此可以认为它是垃圾信息,可以被回收。只要有一个以上的变量引用该对象,该对象就不会被垃圾回收。(注:当一个对象不再被引用后就成为垃圾可以被回收,但是线程就算没有被引用也可以独立运行的,因此与对象不同。)

对于垃圾回收器来说,它使用有向图来记录和管理堆内存中的所有对象,通过这个有向图就可以识别哪些对象是”可达的“(有引用变量引用它就是”可达的“),哪些对象是”不可达的“(没有引用变量引用它就是“不可达”的),所有”不可达“对象都是可被垃圾回收的。

二、垃圾回收算法

垃圾回收都是依据一定的算法进行的,下面介绍其中几种常用的垃圾回收算法。
(1)引用计数算法(Reference Counting Collector)
(2)追踪回收算法(Tracing Collector)
(3)压缩回收算法(Compacting Collector)
(4)复制回收算法(Coping Collector)
(5)按代回收算法(Generational Collector)

三、是否可以主动通知JVM进行垃圾回收?

答:由于垃圾回收器的存在,Java语言本身没有给开发人员提供显式释放已分配内存的方法,也就是说,开发人员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。但开发人员却可以通过调用System.gc()方法来”通知“垃圾回收器运行,当然,JVM也并不会保证垃圾回收器马上就会运行。由于System.gc()方法的执行会停止所有响应,去检查内存中是否有可回收的对象,这会对程序的正常运行以及性能造成极大的威胁,因此不推荐频繁的使用这一方法。

猜你喜欢

转载自blog.csdn.net/MaybeForever/article/details/89056636