1

この質問の調査中:Java:RMIターゲットオブジェクトのガベージコレクション?この呼び出しを初めて行うと、完全なGCがトリガーされることがわかりました。

UnicastRemoteObject.exportObject(new Remote(){}, 0);

-verbose:gcを設定して、上記の呼び出しを含む非常に単純なプログラムを実行しましたが、完全なGCがトリガーされたことを一貫して確認しました。[Full GC 1070K->184K(47552K), 0.0070096 secs]

Eclipse、コマンドライン、仮想マシンと物理マシンで実行しました。私はSunjdkとhotspot1.6を使用しています。

誰かが同様の行動を観察しましたか?その原因は何でしょうか?

4

2 に答える 2

1

GCがjava.rmi.dgc.leaseValueで実行されていることを確認するバックグラウンドスレッドがあります。デフォルトは1時間です。

GCが実行される前にこれを有効にすると、前回のGC以降の今回は長すぎると見なされ、完全なgcがトリガーされると思われます。

これを行うクラスはsun.misc.GCです

于 2012-10-09T07:50:50.977 に答える
0

はい、私は思います、それはフルGCをトリガーします。

RMIシステムで使用される分散ガベージコレクションアルゴリズムは、参照カウントアルゴリズムです。クライアントが最初にリモートオブジェクトへの参照を受信すると、「参照された」メッセージがオブジェクトをエクスポートしているサーバーに送信されます。クライアントのローカルマシン内の後続のすべての参照により、参照カウンターがインクリメントされます。ローカル参照が確定すると、参照カウントがデクリメントされ、カウントがゼロになると、「参照されていない」メッセージがサーバーに送信されます。サーバーにオブジェクトへのライブ参照がなくなり、ローカル参照がなくなると、サーバーは自由にファイナライズされ、ガベージコレクションされます。

1時間に延長されたデフォルトのGC間隔(6200091)セクションについては、以下のリンクも参照してください。

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html

于 2012-10-09T07:46:45.237 に答える