アプリケーションのロードとテストにはすでに長い時間を費やしましたが、プロファイルを作成する必要があります。しかし、不運なことに、VisualVMは、ローカルアプリケーションで常に「このJVMでサポートされていません」と表示しますか?
アプリケーションは、VisualVMと同じJVMで開始されました。
(少なくともWindowsでは)特定のJVMと組み合わせてVisualVMを実行するための小さなバッチファイルを簡単に作成できることがわかりました。これは私にとって賢明です)。フォルダー「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をJavaアプリケーションなどと組み合わせて64ビット用に使用したいときに32ビットバッチファイルを使用できることです。
「開始」コマンドには、バッチファイルが終了するのを待たずにアプリケーションを起動するという唯一の利点があるため、コマンドプロンプトウィンドウはすぐに閉じます。これはVisualVMの機能ではなく、Windowsバッチファイルインタープリターの機能です。
VisualVMは、プロファイリングするプログラムと同じJVM-少なくともJava 6-)で実行する必要があります(同じである必要もありますユーザーですが、このメッセージは適用されません)。
私はそれがあなたの状況でまったく同じJVMだったことをトリプルチェックします。
私の場合、JVMが一致していても(両方とも64ビット)、物事を機能させる唯一の方法は、監視対象のJVMに引数-Dcom.Sun.management.jmxremote
を送信することでした。また、Java Mission Control(JMC))を介した接続に問題がある場合にも機能します。
JMXのドキュメント によると、これは引数の動作です:
このプロパティを設定すると、Java VMプラットフォームのMBeansが登録され、JMXクライアントアプリケーションがローカルJavaプラットフォーム、つまり、Java VM JMXクライアントと同じマシンで実行されている。
これは自動的に有効になるはずでしたが、何らかの理由で私のLinuxにはありませんでした。
Linuxの場合:/ etc/hostsが「ホスト名」の有効なIPアドレスを正しく参照していることを確認してください。
私もこの問題に出会いました。私の場合は、LinuxではTomcat_userでTomcatを起動しましたが、rootユーザーでjvisualvmを実行しています。 rootユーザーでTomcatを起動した後、動作します。
私が見つけた問題は、@ user3356656からのヒントのおかげで、マシンが1つのIP上にあるときにプログラムを起動し、別のIP上にあるときに接続しようとすると失敗することです。
ご覧のとおり、32ビットJVMでVisualVMを実行しています
32ビットJVMをアンインストールする必要はありません。 VisualVMにツアー64ビットJVMを使用するように指示するだけです。
永続的に変更する場合は、編集できます
visualvm_13\etc\visualvm.confで、jvmのパスをここで指定します
VisualvmがWindows 7でのローカルTomcatインストールを検出する問題が発生していました。手動で接続できましたが、メモリスナップショットやvisualgcプラグインなどが有効になりませんでした。同じJVMバージョン、一時ファイルのアクセス許可などを使用していることを確認しました。機能しませんでした。その後、最初にvisualvmを起動し、次にTomcatを起動すると問題が解決することがわかりました。
私もローカルのTomcatで同じ問題を抱えています。stackoverflowの解決策を探しています。いくつかの深刻なデバッグの後、VisualGCにはtool.jarファイルからGC情報を取得する権限がないことがわかりました。
リンクで
http://docs.Oracle.com/javase/7/docs/technotes/tools/share/jstatd.html#SECURITYhttps://stackoverflow.com/a/42107355/ 3876619
問題を解決するための手順に従います
1)許可ファイルを作成する
vim /tmp/tools.policy
追加
grant codebase "file:${Java.home}/../lib/tools.jar" {
permission Java.security.AllPermission;
};
それを保存
2)/tmp/tools.policyをJVM起動パラメーターに追加します
-Djava.security.policy=/tmp/tools.policy
3)SudoでjvisualVmを実行する
次の動作を再現できます。 jvisualvmを開くためのメニュー項目を右クリックするJavaアプリケーションがあります。このJavaアプリケーションを、batファイルからスタンドアロンセットアップとして実行しています。これは、%path%およびその他の必要なJDKなどの環境変数を適宜変更して、環境を形成することを意味します。アプリケーションを起動するBATは、非管理者として実行中としてマークされます。環境は64ビットJDKを指します。次に、他のJavaアプリケーションを管理者として起動します。 VMは、同じ64ビットJDKソースから存在します。次に、右クリック(つまり、非管理者)で最初のアプリからjvisualvmを起動します。 jvisualvmの「アプリケーションリスト」でアプリを表示できますが、「システムプロパティ」をクリックするとエラーが発生します。メッセージは「このJVMではサポートされていません」です。 JVM引数が公開されます。
解決策は他のいくつかの以前のコメントと同様です:管理者として右クリックjvisualvm-starterを起動すると、「システムプロパティ」も表示されます。確かに、JDKが32ビットで、他の64ビットであれば機能しません。行ったことがある。
私は、この小さな半分の作業が進行中のため、この概念をここに追加する必要があると考えました。
私の問題はJVMの最適化でした--XX:+PerfDisableSharedMem
フラグはVisualGCを破壊します。これは、jpsがリストにアプリを表示しない場合に明らかです。
名前をWindowsユーザーに変更し、すべて小文字に設定し、PCを再起動すると、すべて正常に動作するようになりました。
私にとって、その理由は、JVMプロセスを持つ別のユーザーで「jstatd」を実行したからです。 LinuxにはJVMスレッド(Tomcat)を起動する特別なユーザーがいますが、jstatdプロセスはルートで起動します。 rootを使用してjpsを実行する場合、他のユーザーに属するJVMスレッドの情報は表示できません。それが問題です。 rootによって開始された「jstatd」プロセスを強制終了し、JVMプロセスの所有者にsuし、「jstatd」プロセスを再起動します。