9
Java バージョン「1.5.0_14」
Java(TM) 2 ランタイム環境、標準版 (ビルド 1.5.0_14-b03)
Java HotSpot(TM) Server VM (ビルド 1.5.0_14-b03、混合モード)

静的に定義されたフィールドへの参照を渡すために取得している NullPointerException をデバッグしようとしています。具体的には、Drools3 ワーキング メモリ インスタンスにグローバルを設定しています。

workingMemory.setGlobal("log", workingMemorieslog);

私の仮定は、フィールドが静的に定義されているクラスがガベージコレクションされているということです。(受信クラスはWeakReferenceなどを使用している必要がありますが、よくわかりません)

これをどのようにデバッグすることをお勧めしますか? JVM の GC がクラス/クラスのインスタンスをアンロードするタイミングを正確に知ることができれば、バグのある動作の原因を絞り込むことができると思います。(イベントの正確な時間ではない場合、少なくとも何かが起こったという兆候を得る).

ありがとう、マキシム。

4

4 に答える 4

10

GC アクティビティをトレースするには、これを Java コマンドに追加します。

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

取得している NPE は、おそらく null 値を渡していることです。

于 2009-02-22T00:10:01.327 に答える
2

クラスをメモリに保持してから、それがまだ発生するかどうかを確認してください。発生する場合、問題は別の場所にあります。そうでない場合は、問題がガベージ コレクションにあることがわかります。

于 2009-02-22T00:14:17.790 に答える
1

ここでは日食が主な問題であることがわかります。

説明します:

パフォーマンスをテストするために、webapp を main() メソッドでラップしました。多くのサードパーティ コード、つまり Apache commons-pool を使用しています。

いくつかのバージョンの jar がプロジェクト (eclipse プロジェクト) に分散していたことがわかりました。これらのプロジェクトを使用する私のアプリには commons-pool-1.3 があり、別のプロジェクトには commons-pool-1.2 がありました。

サーブレット コンテナー (Tomcat6) を使用してロードすると、webapp クラス ローダーが最優先され、常に webapp バージョンがロードされました。main() eclipse を使用してアプリケーションを起動したとき、現在のプロジェクト内の依存プロジェクトの jar の前に -classpath 内の依存プロジェクト jar をエクスポートする動作はあまり賢明ではありませんでした。

競合は commons-pool の 2 つのバージョン間で発生し、未定義の動作を引き起こしました。実装コードの内部は調べていませんが、これは GenericKeyedObjectPool (問題のあるクラス) が保持する静的マップと関係があると思います。新しいインスタンスが作成されたため、前述のグローバルへの null 参照が実際に含まれています。

私の運の解決策はかなり単純で、commons-pool は私の webapp でのみ使用されているため、参照されているすべてのプロジェクトから削除することができました。どちらもできなかったとしたら、何をしていたのか本当にわかりません。これはEclipseの非常に奇妙なデフォルトです。

読んで助けてくれてありがとう。

//ps。3日。これは、サーブレットの代替コードで何が間違っていたのかを理解するために費やした時間です。私も問題ではないことがわかりました。:P

于 2009-02-22T16:23:16.883 に答える
0

スタックトレースはありますか?

何が起こっているのかを確認するために、「setGlobal」メソッドに足を踏み入れてみましたか (コードがあると仮定します)。

于 2009-02-22T00:06:09.637 に答える