2008年9月3日星期三

JVM_004:Java 垃圾回收机制(摘录+整理)

机 器的内存是非常宝贵的资源,当不需要对象时,我们应该把对象的空间释放出来,留给其它对象使用。
与C/C++语言不同,Java语言不需要程序代码来显式的释放,而是由Java的垃圾收集器(GC)来完成的。由于Stack能够自动释放空间,因此垃圾回收GC是针对Heap的。
垃圾回收的好处是开发人员再也不用自己申请和释放内存了,避免了内存管理不当而导致的JVM Crash。但凡事有利就有弊,垃圾回收的潜在问题是使用一个额外进程跟踪所有对象的Reference,会导致一定的系统开销,使用的不好还会影响程序的性能。

目前大多数开发人员很少知道GC,更遑论设置GC了。
“我真的需要关心GC吗?”——这个问题很具有普遍性,在汶川地震之前我觉得地震和我一点都扯不上。很多事情都是这样,惨剧发生了,人们才开始反思,总结经验教训。为何不未雨绸缪呢?没感觉到GC的原因很简单:在正常情况下,GC的占用的时间极短。
触发GC的条件有两个:
(1)应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用。
(2)Heap内存不足时,JVM会强制GC。 需要强调的是,大多数JVM的GC线程与应用线程是互斥的,即GC线程运行时(stop-the-world),其他线程都要暂停下来。

没有评论: