- PR -

GCで「完了時に処理されない例外」とは?

1
投稿者投稿内容
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2004-01-10 22:29
お世話になっております。

IBM Websphereのv3.5.4(今時ではありますが・・・)で、ガベージ状況を把握しようと-verbose:gcオプションを付加してServerを起動しましたところ、ガベージコレクションが走ったタイミングで、

> GC: 完了時に処理されない例外; オブジェクト・クラス(以下クラス名が続きます)

というログが出力される場合があります。

おそらく、文字通り表示されているオブジェクト(自作クラスのオブジェクト)がGCの対象外となってしまったんだとは思うのですが、どういった場合にこのようになるかご存知の方はいらっしゃいますでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-01-11 13:45
unibon です。こんにちわ。
#あまり分からないのですが。

引用:

syoさんの書き込み (2004-01-10 22:29) より:
IBM Websphereのv3.5.4(今時ではありますが・・・)で、ガベージ状況を把握しようと-verbose:gcオプションを付加してServerを起動しましたところ、ガベージコレクションが走ったタイミングで、

> GC: 完了時に処理されない例外; オブジェクト・クラス(以下クラス名が続きます)

というログが出力される場合があります。


以下、外している可能性も高いのですが、GC とは関係ないエラーなのではないでしょうか。
標準出力あるいは標準エラー出力にエラーメッセージが出る際に、GC のものとそうでないものが混じっているだけかもしれません。とは言うものの、-verbose:gc の有無でこれらのメッセージの有無が決まるのならば、やはり GC のメッセージなのでしょうか。
「完了時に処理されない例外」を Google で検索してもヒットしないのですが、英語でなんと言うのでしょう。なまじ日本語化されていると分かりにくいですね。「完了」とは何の完了なのでしょう。
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2004-01-11 18:20
unibonさん、ありがとうございます。

引用:

unibonさんの書き込み (2004-01-11 13:45) より:

標準出力あるいは標準エラー出力にエラーメッセージが出る際に、GC のものとそうでないものが混じっているだけかもしれません。とは言うものの、-verbose:gc の有無でこれらのメッセージの有無が決まるのならば、やはり GC のメッセージなのでしょうか。
「完了時に処理されない例外」を Google で検索してもヒットしないのですが、英語でなんと言うのでしょう。なまじ日本語化されていると分かりにくいですね。「完了」とは何の完了なのでしょう。



私は、「以下のオブジェクトは、参照がなくなってGC対象となりましたが、GC完了時には処理されませんよ」という意味だと思っています。ちなみに、このメッセージに限らず、なんか無理矢理な翻訳(機械的な直訳?)って感じのメッセージが多いので、オリジナルメッセージがわかればいいのですが(^^;;

ただ、仮に上記の理解で正しいとした場合、なぜGC対象となったのにGC処理対象外になってしまうのかが疑問です。

当然のことながら、明らかに参照が残っているようなオブジェクトに関するログは出力されておりません(それらが全て出力されたらとんでもないログの量になりそうです(笑))。なお、このメッセージが出力されるのも、全てのオブジェクトではなく特定のオブジェクトであるため、そのオブジェクト(あるいはクラス)に特有の何か(例えばGC対象外となってしまうようなコーディング)があるのかと思ってソースを調べて見たのですが、メッセージが出力されるオブジェクトとされないものとの違いがつかめません。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-01-11 22:21
ご指摘のメッセージに遭遇したことはありませんが、finalize メソッド実行時に実行時例外が発生したのではないでしょうか?
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2004-01-12 08:40
>私は、「以下のオブジェクトは、参照がなくなってGC対象となりましたが、GC完了時には
>処理されませんよ」という意味だと思っています。
>ただ、仮に上記の理解で正しいとした場合、なぜGC対象となったのにGC処理対象外に
>なってしまうのかが疑問です。
これをみてピンと来ました.インクリメンタルGCの話じゃないでしょうか.

たぶん「今回のGCでは回収されず,次回のGC時に回収される」という意味と思います,
インクリメンタルGCでは,マーク付けの起動時に既にゴミになっているオブジェクトは
その回に回収されますが,マーク付け途中で新たにゴミになった場合はその回に
回収される保証はありません.
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2004-01-12 12:33
インギさん、悪夢を統べるものさん、ありがとうございます。

引用:

インギさんの書き込み (2004-01-11 22:21) より:

ご指摘のメッセージに遭遇したことはありませんが、finalize メソッド実行時に実行時例外が発生したのではないでしょうか?



今ソースが手元にないのですぐには確認できないのですが、明日以降確認してみようと思います。あと、あえてfinalizeメソッド中で確実に例外を出力してしまうようなコードを書いた場合の挙動も確認してみようと考えています。

引用:

悪夢を統べるものさんの書き込み (2004-01-12 08:40) より:

たぶん「今回のGCでは回収されず,次回のGC時に回収される」という意味と思います,
インクリメンタルGCでは,マーク付けの起動時に既にゴミになっているオブジェクトは
その回に回収されますが,マーク付け途中で新たにゴミになった場合はその回に
回収される保証はありません.



ということは、このメッセージ自体はあまり気にしなくて良い、ということになるんでしょうか(WAS3.5.4で使用しているVMはIBM JDK1.2.2なのでインクリメンタルGCになると思います)。
ただ、似たような作りのクラスでもまったくメッセージが出ない場合がある(というか、ほとんどの場合出力されない)んですよねぇ・・・。逆に、あるクラスのオブジェクトはほぼ確実にメッセージが出力されています。もう少しログを詳細に調べて、残存参照数の変化や空きメモリ量の変化を追ってみます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-01-13 00:03
unibon です。こんにちわ。

ためしに、つぎのようなコードを Sun J2SE SDK 1.4.2 で動かした場合、-verbose:gc を付けても付けなくても、とくにエラーメッセージは表示されなかったです。

コード:
public class Foo {

    protected void finalize() {
        //System.out.println("finalize");
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {
            Foo foo = new Foo();
        }
    }
}


私は今まで知らなかったのですが finalize メソッド中で throw した RuntimeException は、闇に葬り去られてしまうのですね。
たぶん言語仕様で決まっていることなのだろうとは思いますが、なぜ表示されないのかが奇妙に感じます。
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2004-01-31 09:26
自宅のADSL環境変更に伴い、しばらく間が空いてしまいましたm(_ _)m

引用:

unibonさんの書き込み (2004-01-13 00:03) より:
unibon です。こんにちわ。

私は今まで知らなかったのですが finalize メソッド中で throw した RuntimeException は、闇に葬り去られてしまうのですね。
たぶん言語仕様で決まっていることなのだろうとは思いますが、なぜ表示されないのかが奇妙に感じます。



普段使用している開発環境(VisualAge for Java)で同様のことを試してみましたが、finalize内でthrowした例外がコンソールに出力されていました。
VAで使用されているのはJDK1.2.2(おそらくIBM JDK1.2.2)ですので、もしかすると実装に依存するのかもしれませんね。もっとも、「統合開発環境だから」なのかもしれませんが。

なお、「完了時に処理されない例外」は、そのインスタンスが保持しているインスタンス変数の状態によって表示される場合があるようです。インスタンス変数をクリアする処理を追加することによりメッセージが出力されなくなりました。

どういうインスタンス変数を使用している時にこのような現象が出るのかまでは追跡していませんが、メモリ使用量などを追跡してみると、特にメモリリークは発生していないようで、おそらく次以降のGCのタイミングで処理されているのではないかと思われます。
1

スキルアップ/キャリアアップ(JOB@IT)