アプリケーションのロードとテストに長い時間を費やしたので、プロファイルを作成する必要があります。しかし残念なことに、私のローカル アプリケーションでは、VisualVM は常に「この JVM ではサポートされていません」と表示します。
アプリケーションは、VisualVM と同じ JVM で開始されました。
(少なくともWindowsでは)特定のJVMと組み合わせてVisualVMを実行するための小さなバッチファイルを簡単に作成できることがわかりました。これは、64ビットJDKと一緒に32ビットJDKをインストールしたため(両方が必要なので、これは私にとって賢明です)。「S:\applications\visualvm\bin\」フォルダーに 2 つのバッチ ファイルを作成しました。
run_32.bat:
@echo off
START "VisualVM 32" visualvm.exe --jdkhome "C:\Program Files (x86)\Java\jdk1.7.0_07"
run_64.bat:
@echo off
START "VisualVM 64" visualvm.exe --jdkhome "C:\Program Files\Java\jdk1.7.0_07"
明らかに、システムによってすべてのパスが異なる場合がありますが、一般的な考え方は正しく動作するはずです (Windows のすべての 64 ビット バージョン)。利点は、VisualVM を 32 ビット JVM で実行される Java アプリケーションと組み合わせて使用したい場合に、32 ビット バッチ ファイルを使用できることです。
「開始」コマンドには、バッチ ファイルがアプリケーションの終了を待たずにアプリケーションを起動するという唯一の利点があるため、コマンド プロンプト ウィンドウはすぐに閉じます。これは VisualVM の機能ではなく、Windows バッチ ファイル インタープリターの機能です。
私の場合、JVM が一致していても (両方とも 64 ビット)、動作させる唯一の方法は、-Dcom.sun.management.jmxremote
監視対象の JVM に引数を送信することでした。これは、Java Mission Control (JMC) 経由での接続に問題がある場合にも機能します。
JMXのドキュメントによると、これは引数が行うことです:
このプロパティーを設定すると、Java VM プラットフォームの MBean が登録され、プライベート・インターフェースを介してリモート・メソッド呼び出し (RMI) コネクターが公開され、JMX クライアント・アプリケーションがローカル Java プラットフォーム (つまり、JMX クライアントと同じマシンで実行されている Java VM) をモニターできるようになります。 .
これは自動的に有効になるはずでしたが、何らかの理由で私の Linux にはありませんでした。
VisualVM は、プロファイリングするプログラムと同じ JVM (少なくとも同じ 32 ビット/64 ビット サイズの Java 6) で実行する必要があります。(同じユーザーである必要もありますが、このメッセージは適用されません)。
あなたの状況でそれがまったく同じJVMであることをトリプルチェックします。
ご覧のとおり、32 ビット JVM で VisualVM を実行しています。
32 ビット JVM をアンインストールする必要はありません。VisualVM にツアー 64 ビット JVM を使用するように指示するだけです。
永久に変更したい場合は、編集できます
visualvm_13\etc\visualvm.confで、ここで jvm のパスを指定します
私もこの問題に遭遇しました。私の場合、Linux では tomcat_user で tomcat を起動しましたが、root ユーザーで jvisualvm を実行しました。root ユーザーで tomcat を起動すると動作します。
@ user3356656 からのヒントのおかげで、私が見つけた問題は、マシンが 1 つの IP にあるときにプログラムを起動し、別の IP にあるときに接続しようとすると失敗することです。
私の問題は JVM の最適化でした --XX:+PerfDisableSharedMem
フラグは VisualGC を壊します。これは、jps がリストにアプリを表示しない場合は明らかです。