2013-11-20 11 views
5

を使用してJava逆シリアル化中に多数のint配列インスタンスがあることがわかりました。これは依存関係追跡オブジェクト(java.io.ObjectInputStream$HandleTable$HandleList)の作成によるものだと私は理解しています。私が理解しているように、それらはClassNotFoundExceptionをオブジェクトを読み込んでいるときに "従属"オブジェクトに伝播するために使用されます。Java逆シリアル化中のint配列の膨大な数

ClassNotFoundExceptionの対象オブジェクトに対するこの依存関係を追跡する必要性を理解できません。 ClassNotFoundExceptionが見つかった場合、実装はすぐに例外をスローできないのはなぜですか?

jermapを使用してヒストグラムを作成した後で、私はスパイクをint[]インスタンスに帰属させることができました。私が働いているJavaアプリケーションのうち、デシリアライズ中に一時的なメモリ使用量に大きなバンプがあります。

ClassNotFoundExceptionに遭遇したときにデシリアライズプロセスを終了するのがOKであるかどうかを判断しようとしています。この場合、ObjectInputStreamを変更して、ブートストラップクラスパスで変更されたクラスを使用したいと思います。

HandleTableの「エントリ」は、以前に読み込まれたオブジェクトをストリームから後で読み込まれる依存オブジェクトに結びつけるために絶対に必要とされることを認識しています。明確にするために、私は理解していないjava.io.ObjectInputStream$HandleTable$HandleListの意義について質問されました。

洞察力があれば幸いです。

ありがとう、
Raja。

答えて

1

これは循環参照を解決しシリアライズ前に、同じオブジェクトC を指す2つのオブジェクトA及びBがデシリアライゼーション後にC の二つの別々のインスタンスを指していないことを保証するためにオブジェクトを追跡します。 追跡参照がない場合、Aのオブジェクト階層が逆シリアル化されるとCのインスタンスが作成され、次にBオブジェクト階層のデシリアライズ時に別のCインスタンスが作成されます。ClassNotFoundExceptionとはほとんど関係ありません。

多くのオブジェクトに対してオブジェクトを再利用するのではなく、オブジェクトの1つのグラフをデシリアライズするとすぐにObjectInputStreamsをスローすることができます。

+0

バックリファレンスは 'java.io.ObjectInputStream $ HandleTable.entries'で追跡されます。そして、はい、彼らはあなたが言ったことに必要です。しかし、私の質問は、HandleListの配列である 'java.io.ObjectInputStream $ HandleTable.deps'に関するものです。 'ObjectInputStream'のコードを見ると、これはClassNotFoundExceptionの依存関係追跡のためのものです。 'entries'配列は参照を参照するのに十分でなければならず、' deps'はこの目的のために必要ではありません。これは本当ですか? –

+0

はい、 '' deps''はClassNotFoundException伝播用に設計されているようです。すべてのクラスがデシリアライズ時に存在することを100%確信していて、このオーバーヘッドを排除したい場合は、 '' ObjectInputStream''ソースを独自の '' MyObjectInputStream''クラスにコピーして、依存関係のトラッキングを取り除きます。 – brettw

+0

変更されたコードに 'ClassNotFoundException'があっても、すぐに例外を投げて伝播したいと思います。だから失敗はまだ明らかです。 –

関連する問題