java System.gc() 与 Runtime.getRuntime().gc() 有什么区别?

急需建设性的回答,不要说什么conveniece,要得是区别,他们的不同
关注者
10
被浏览
5738
同Kane Sun的回答。java.lang.System.gc()只是java.lang.Runtime.getRuntime().gc()的简写,两者的行为没有任何不同。唯一要能说有什么不同那就是在字节码层面上调用前者比调用后者短一点点,前者是1条字节码而后者是2条

System.gc():
invokestatic java/lang/System.gc()V


Runtime.getRuntime().gc():
invokestatic java/lang/Runtime.getRuntime()Ljava/lang/Runtime;
invokevirtual java/lang/Runtime.gc()V

实际运行起来性能几乎一样。不过如果对字节码大小非常非常敏感的话建议用System.gc()。从通常的代码习惯说也是System.gc()用得多些。

---------------------------------------------------------------

要说别的触发GC的方式,倒确实还有别的。
一个是进程内外皆可用的、基于JMX的方式,java.lang.management.MemoryMXBean.gc()。例如说JConsole里的“GC”按钮就是用这个方式实现的,参考这帖:hllvm.group.iteye.com/g
另一个是Oracle/Sun系的JVM所支持的attach API,从Java 6开始可以用。例如说通过jmap -histo:live这样会触发一次full GC,这个就是基于attach API来实现的。