finalizerについて


javaでfinalizerっていうのがある。絵を入れたい。

finalizerについて

 finalizeメソッドは、ガベージコレクション(以下GC)によって、finalizeメソッドを実装しているオブジェクトが回収の対象となったとき、回収される前に自動的に呼び出されるメソッドである。

 オブジェクトが回収される前に呼び出されるので、オブジェクトの持っているリソースを解放するのに便利であるが、現在では「finalizeメソッドあまり使ってはいけないよ。」と言われている。その理由は以下のとおりである。

  • finalizeメソッドはいつ実行されるかわからない(実行されないかも)
  • finalizeメソッドが呼び出されるまで、GCはそのオブジェクトを回収できない

 まず第一の理由として、finalizeメソッドはGCが行なわれた後、すぐに実行されるわけではないのである。というのもfinalizeメソッドは、Javaのシステムスレッドの一つであるFinalizerスレッドにより呼び出される。つまり、このFinalizerスレッドがモタモタしていると、どんどんfinalizeメソッドの呼び出しが遅れるわけである。

 また最悪の場合、「finalizeメソッドが実行されない」ということもある。finalizeメソッドが呼び出される前に、Javaプログラムが終了してしまう場合がそれである。  SystemクラスのrunFinalizersOnExit?メソッドを呼び出しておくと、Javaプログラムが終了する直前にすべてのオブジェクトのfinalizeメソッドを実行することができるが、これがまた最悪である。なぜなら、GCによる回収の対象となっていないオブジェクトのfinalizeメソッドまで実行してしまうからだ。

 第二の理由として、GCはfinalizeメソッドが呼ばれていないオブジェクトを回収できないということである。オブジェクトをfinalizeメソッド実行前に回収してしまうと、そのオブジェクトのfinalizeメソッドが実行できなくなってしまうのだから当然である。

 Finalizerスレッドがモタモタすればするほど、メモリは圧迫されていく。最悪OutOfMemoryError?でプログラムが強制終了することもある。

 そもそもfinalizeメソッドが実装されているオブジェクトについては、二回GCを行なわないと回収できないのである(一回目は「finalizeしてもいいよー」って合図をおくる。二回目は回収する)。

 けどやっぱり回収前に自動的に呼び出されるメソッドは便利だ。効率よく使おう。

参考文献


コメントちゃん。

  • 今見ると、何よこの糞文章。支離滅裂やん。 -- クソゴミ? 2008-10-12 (日) 01:42:56