を使用して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。
バックリファレンスは 'java.io.ObjectInputStream $ HandleTable.entries'で追跡されます。そして、はい、彼らはあなたが言ったことに必要です。しかし、私の質問は、HandleListの配列である 'java.io.ObjectInputStream $ HandleTable.deps'に関するものです。 'ObjectInputStream'のコードを見ると、これはClassNotFoundExceptionの依存関係追跡のためのものです。 'entries'配列は参照を参照するのに十分でなければならず、' deps'はこの目的のために必要ではありません。これは本当ですか? –
はい、 '' deps''はClassNotFoundException伝播用に設計されているようです。すべてのクラスがデシリアライズ時に存在することを100%確信していて、このオーバーヘッドを排除したい場合は、 '' ObjectInputStream''ソースを独自の '' MyObjectInputStream''クラスにコピーして、依存関係のトラッキングを取り除きます。 – brettw
変更されたコードに 'ClassNotFoundException'があっても、すぐに例外を投げて伝播したいと思います。だから失敗はまだ明らかです。 –