一、java中的垃圾回收机制

在传统语言C/C++中,程序员要手动回收过期的内存,而java在这方面便有属于自己自动回收过期内存的机制。

在JVM虚拟机提供了一个系统级的java垃圾回收线程GC(Carbage  Collection),它负责回收失去引用的对象所占用的内存。当一个对象失去其所有引用之后,GC线程便会解除它所占用的内存空间,以避免内存泄漏。GC会检测对象的任何状态包括申请,引用,被引用等运行状态,从而得知对象是处于尚存在引用的可触及状态,还是处于刚失去引用的可复活状态,当对象处于可复活状态时,GC线程将会在一段时间内调用该对象的 finalize()方法,根据需要将该对象设置为可触及状态或者不可触及状态。当对象处于不可触及状态时,该对象所占用的内存将会被回收,这就是java中的垃圾回收机制。

二、什么是内存泄漏问题

内存泄漏是指由于程序错误的设计而造成无法释放已经不再使用的内存而造成资源浪费的问题。

虽然java有自己独特垃圾回收机制,但是当程序员由于疏忽大意而忘记解除一个对象不该持有的引用或者由于错误设计而导致某些对象始终被引用时,便会发生内存泄漏问题。

三、java中常见产生内存垃圾现象

1>超出对象的引用句柄作用域,

例{

A a1 = new A();

..........

}

句柄a1的作用域只到大括号“}”处,大括号内的代码执行完成后,产生的A对象便会变成垃圾,因为已经超过了引用句柄a1的 作用域

2>没用超出对象的引用句柄的作用域时,当把引用设置为null时

{

A a1 = new A();

a1= null;

..........

}


在执行完a1 = null时,该对象便不被任何句柄引用,变成了垃圾

3.创建匿名对象时,匿名对象用完便变成了垃圾

{

new A();

new A().run();

}

当执行完run()方法后,该对象变成了垃圾。因此,少用匿名对象在一定程度上可以减少内存泄漏问题的发生。