1. 何为GC
Java与C语言相比的一个优势是,可以通过自己的JVM自动分配和回收内存空间。
垃圾回收机制是由垃圾收集器Garbage Collection来实现的,GC是后台一个低优先级的守护进程。在内存中低到一定限度时才会自动运行,因此垃圾回收的时间是不确定的。
为何要这样设计:因为GC也要消耗CPU等资源,如果GC执行过于频繁会对Java的程序的执行产生较大的影响,因此实行不定期的GC。
与GC有关的是:JVM运行时数据区中的堆(对象实例会存储在这里)和 gabagecollector方法。
垃圾回收GC只能回收通过new关键字申请的内存(在堆上),但是堆上的内存并不完全是通过new申请分配的。还有一些本地方法,这些内存如果不手动释放,就会导致内存泄露,所以需要在finalize中用本地方法(nativemethod)如free操作等,再使用gc方法。
2. 何为垃圾
Java中那些不可达的对象就会变成垃圾。对象之间的引用可以抽象成树形结构,通过树根(GC Roots)作为起点,从这些树根往下搜索,搜索走过的链称为引用链。
当一个对象到GC Roots没有任何引用链相连时,则证明这个对象为可回收的对象。
可以作为GC Roots的主要有以下几种:
(1)栈帧中的本地变量表所引用的对象。
(2)方法区中类静态属性和常量引用的对象。
(3)本地方法栈中JNI(Native方法)引用的对象。