1、在java中,GC代表的是垃圾回收(Garbage Collection,GC),它的主要作用是用于回收程序中不再使用的内存。回收的是无任何引用的对象占据的内存空间,并不是对象本身。
2、在java中,垃圾回收器自动检测对象的作用域,可自动地把不再被使用的存储空间释放掉。
3、垃圾回收器主要完成3项任务
(1)、分配内存;
(2)、确保被引用的对象的内存不被错误的回收;
(3)、回收不再被引用的对象的内存空间;
4、对于垃圾回收器来说,使用的是有向图来记录和管理堆内中的所有对象,通过有向图就可以识别哪些对象是“可达的”(有应用变量应用它就是“可达的”),哪些对象是“不可达的”(没有引用变量引用它就是“不可达的”),所有“不可达”对象都是可被垃圾回收器回收的。
5、(1)、一旦成为垃圾对象,只有下次垃圾回收器运行的时候才会被回收,而不是立马就被清除。
(2)、finalize()方法是在对象空间被回收前调用的。
(3)、当一个对象不在被引用后就会成为垃圾可以被回收;但是线程就算没有被引用也可以独立运行的,因此与对象是不同的。
(4)、在c++语言中,调用了析构函数后,其对象一定会被销毁;而java语言中,调用了finalize()方法,垃圾却不一定被回收;
6、几种垃圾回收算法
(1)、引用计数算法
在堆中对每一个对象都有一个引用计数器,当对象被引用时,计数器就加1;当引用被置为空或者离开了作用域时,引用计数减1。
(2)、追踪回收算法
追踪回收算法利用JVM维护的对象引用图,从根节点开始遍历对象的应用图,同时标记遍历到的对象。当遍历结束后,未被标记的对象就是目前已不被使用的对象,则可以被回收了。
(3)、压缩回收算法
(4)、复制回收算法
(5)、按代回收算法
7、由于垃圾回收器的存在,java语言本身没有给开发人员提供显式释放已分配内存的方法,也就是在实际开发中,开发人员不能实时的调用垃圾回收器对某个对象或者所在对象进行垃圾回收。但是开发人员可以调用System.gc()方法来通知垃圾回收器运行,但是JVM并不会保证垃圾回收器立马就会运行。执行System.gc()方法会停止所有的响应,去检查内存是否有可回收的对象,但是一般不建议使用这一方法。