2011-02-08 11 views
4

実行時にオブジェクトがヒープ上にどのように作成されるかを見るためのツールを探しています。 私はVisualVM - Profilesを使用していましたが、特定のタイプの変数(探しているもの)が作成されているときは見つかりませんでした。たぶん私は何か間違ったことをするでしょう... 私は、APIを使ってそのような情報を得る方法について何かヒントを得ることに感謝します。通常実行時にJavaヒープの内容を確認する

よろしく、 マルチン

答えて

4

、(例えばJProfilerなど)プロファイラは、あなたがこれを見ることができるようになります - 例えばAllocation recording explainedスクリーンキャストを参照してください。

しかし、JVMに低レベルの操作を代行できるエージェントを接続することで、これを実現します。この情報は通常、ユーザーまたはJavaプログラムでは使用できません。そのため、JConsoleやJVisualVMなどのJMXアプリを介してヒープを表示することはできません。

+0

ヒントをありがとう、私はあなたに知らせるためにそれを試してみましょう。 –

+0

VisualVMにはヒープダンプという素晴らしい機能があります。これはヒープの内容を反映しており、非常に便利です。 JProfilerから実行中のアプリケーションを接続する方法 –

2

VisualVMプロファイラの内部で、[設定]を選択し、プロファイルするクラスを指定します。あなたはまた、レコード割り当てスタックのオプションを調べる必要があるかもしれません。

+0

heapdumpは私に現在のヒープの内容を見せてくれました。ありがとうございました –

1

あなたはプログラムをデバッグしようとしているようですが、デバッガを使用するのが最良の選択肢になると思います。あなたは、変数にあなたが探している値が割り当てられているときに、プログラムを停止するための条件付きブレークポイントを追加することができます。これにより、その時点でのすべての値とコールスタックを参照して、そのコールを作成するために何が呼び出されたかを確認することができます。

+0

私はいくつかのフレームワークで作業していますし、シーンの背後にはたくさんのことがあります。だから私はデバッガ以上のものが必要です。問題は、 "new"演算子で2回インスタンス化されたインスタンスフィールドがあり、古い参照を処理するフレームワークの方法が削除されていないと思われるためです。何が起こっているかを確かめるためにプログラムのヒープを見る必要があります。 –

+0

@sznury、あなたは私になぜデバッガ以上のものが必要なのかを明確にしていません。あなたのアプリケーション/フレームワークがそうするべき振る舞いをしていない場合は、バグがあります。インスタンスフィールドをインスタンス化できるのは、オブジェクトの作成時に1回しかインスタンス化できず、フィールドへの参照を持つことができないためです。フィールドの値を変更していると仮定していますが、フレームワークの古い値が何とか見えています。 –

+0

何が起こっているのかを少数の言葉で説明するのはあまりにも複雑です。インスタンスフィールドAは、オブジェクトの作成時にインスタンス化することができ、後で_final_修飾子を持たない場合、_new_演算子を使用してAの値を変更することができ、それがポイントです。 –

関連する問題