System.gc()用于垃圾收集器,调用垃圾收集器将回收未使用的
System.gc()进行回收的准则:
回收没有被任何可达变量指向的对象
JDK实现
public static void gc() { Runtime.getRuntime().gc(); }
调用了Runtime类的gc方法
public native void gc();
Runtime类的gc方法是个native方法,只能进入JVM代码去看其真正的实现
JVM实现
JNIEXPORT void JNICALL Java_java_lang_Runtime_gc(JNIEnv *env, jobject this) { JVM_GC(); }
直接调用了JVM_GC()方法,在jvm.cpp中实现的
以此找下去,会发现,System.gc()会触发Full GC
Full GC 耗时比较长,对应用影响较大,一般不推荐使用System.gc()
在有使用堆外内存的情况下,如果堆外内存申请不到足够的空间,jdk会触发一次System.gc(),来进行回收
建议:
不要频繁使用gc函数
保持代码健壮(将不用的变量置为null),让虚拟机去管理内存