[解決済み] jmapの実行 ソケットファイルを開くことができない
質問
を実行する必要がありました。
jmap
のヒープダンプを取得するためです。
jvm
が返されました。
Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
そこで、私は
-F
:
./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
-
使用方法
-F
はヒープダンプをとってもいいのでしょうか? - 20分待っていますが、まだ終わりません。何か理由があるのでしょうか?
解決方法は?
jmap
vs.
jmap -F
と同様に
jstack
vs.
jstack -F
は、ターゲットJVMと通信するために、全く異なるメカニズムを使用します。
jmap / jstack
を使わずに実行した場合
-F
これらのツールは
ダイナミックアタッチメカニズム
. これは次のように動作します。
-
Javaプロセス1234に接続する前に。
jmap
はファイルを作成します。.attach_pid1234
をターゲットプロセスの作業ディレクトリまたは/tmp
. -
次に
jmap
送るSIGQUIT
をターゲットプロセスに送信します。JVMがシグナルをキャッチして.attach_pid1234
を起動します。AttachListener
のスレッドを作成します。 -
AttachListener
スレッドがUNIXドメインソケットを作成する/tmp/.java_pid1234
外部ツールからのコマンドを受け付ける。 -
セキュリティ上の理由から
jmap
) が受け入れられると、JVM はソケットピアのクレデンシャルがeuid
とegid
JVM プロセスの そのためjmap
は、異なるユーザー(rootであっても)で実行された場合、動作しません。 -
jmap
はソケットに接続しdumpheap
コマンドを実行します。 -
このコマンドを読み込んで実行するのは
AttachListener
のスレッドを使用する。すべての出力は、ソケットに送り返されます。ヒープダンプはJVMが直接インプロセスで行うので、動作は実に高速です。しかし、JVMがこれを行えるのは セーフポイント . セーフポイントに到達できない場合(例えば、プロセスがハングアップしている、応答がない、長いGCが進行中であるなど)。jmap
はタイムアウトして失敗します。
Dynamic Attachのメリットとデメリットをまとめてみましょう。
長所
- ヒープダンプなどの処理をJVMで協調して最高速度で実行します。
-
の任意のバージョンを使用することができます。
jmap
またはjstack
を使用して、他のバージョンのJVMに接続することができます。
短所
-
ツールは同じユーザーで実行する必要があります (
euid
/egid
) をターゲットJVMとして使用します。 - ライブで健康なJVMでのみ使用可能です。
-
で起動した場合は動作しません。
-XX:+DisableAttachMechanism
.
jmap -F / jstack -F
で実行した場合
-F
の機能を持つ特殊なモードに切り替わります。
HotSpot サービスアビリティエージェント
. このモードでは、対象プロセスはフリーズし、ツールはOSのデバッグ機能を介してそのメモリを読み取る。
ptrace
Linuxの場合
-
jmap -F
を呼び出すPTRACE_ATTACH
をターゲットJVM上で実行する。に応答して、ターゲット・プロセスは無条件に中断される。SIGSTOP
シグナルを送信します。 -
このツールは、JVMメモリを読み込む際に
PTRACE_PEEKDATA
.ptrace
は一度に1ワードしか読めないので、ターゲットプロセスの大きなヒープを読むためにあまりにも多くのコールが必要です。これは、非常に、非常に遅いです。 -
このツールは、特定のJVMバージョンの知識に基づいて、JVM内部構造を再構築する。JVMの異なるバージョンは、異なるメモリレイアウトを持っているので。
-F
モードが動作するのはjmap
は、ターゲットのJavaプロセスと同じJDKから来たものです。 -
ツール自身がヒープダンプを作成し、ターゲットプロセスを再開します。
長所
- ターゲットJVMの協力は不要です。ハングアップしたプロセスでも使用可能。
-
ptrace
は、OSレベルの権限で十分な場合に動作します。例えばroot
は、他のすべてのユーザのプロセスをダンプすることができます。
短所
- 大きなヒープに対して非常に遅い。
- ツールとターゲットプロセスは、同じバージョンのJDKである必要があります。
-
強制モードでのアタッチメントの場合、セーフポイントは保証されません。ただし
jmap
はすべての特殊なケースを処理しようとしますが、時にはターゲットJVMが一貫した状態でないことが起こるかもしれません。
注意事項
強制モードでヒープダンプを取るには、より速い方法があります。まず、コアダンプを
gcore
を実行し、次に
jmap
を生成されたコアファイル上で実行します。参照
関連質問
.
関連
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み】Javaメソッドスタブ
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] Python の open() はファイルが存在しない場合、ファイルを作成しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】javaで指定されたファイルが見つからない
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】intがnullであるかどうかを確認する方法