首页 > 代码库 > 垃圾回收机制和内存泄露

垃圾回收机制和内存泄露

在C/C++中,需要程序员手动地回收分配的内存,否则一直被占用,这就会带来一些问题,当程序员忘记回收无用内存或者错误回收程序核心类库的内存,都会导致程序的崩溃。

在java中不必程序员关心内存回收,当没有对象引用的对象所占用的内存(注意不是对象本身)时,java视其为垃圾,会有JRE在后台自动完成回收。这种机制称为垃圾回收机制(Garbage Collection ,简称GC)。下面我们来回答下面几个问题:

1、由谁来回收垃圾?

在java程序运行过程中,有一个垃圾回收器(GC)会不定时地被唤起检查是否有不被引用的对象,它的唤起是无规律可循的,并不是一产生垃圾就马上回收,很可能到程序结束后垃圾回收器都没有启动,程序员无法精准的控制回收时间和顺序,所以这也是为什么java不能完全避免内存泄露问题的原因。

2、 触发主GC(Garbage Collector)的条件?

JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:

  1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。

  2)Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。

  由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行 的。

3、垃圾收集的策略