問題タブ [jvisualvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java スレッドの監視\プロファイリング\測定
私はよく知っています
http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html
スレッドが取得した CPU 時間をテスト\プロファイル\測定したいと思います。スレッド コンストラクターに以下を追加しました。
次に、スレッドの実行が終了したら、次を実行しました。
しかし、私のスレッドのほとんどは、CPU を占有していることを絶対に確信しており、実行時間はゼロ (execTime == 0) です。
スレッドの測定方法を教えてください。上記の手順で何が問題になる可能性がありますか?
ありがとうございます。
windows - Windowsサービスとして実行されているJavaプロセスへの接続:JProfilerはどのように接続しますか?
JMXを使用しないJvisualVMのようなトレースツールをWindowsサービスとして実行されているJavaプロセスに接続するにはどうすればよいですか?
サービスとして実行されているJVMが強化されているJvisualVMを起動すると、サービスとして実行されているJVMが「表示」されません。こことここに未回答の質問がいくつかあります。このブログ投稿でいくつかの役立つヒントを見つけましたが、常に機能するとは限りません。
Jprofilerには、問題を解決する魔法のボタン「サービスの表示」があります。誰かがそれをどのように行うか知っていますか?JvisualVMを使用して接続するために同じことを行うにはどうすればよいですか?
java - Javaメモリ使用量/スレッドプールパフォーマンスの問題
これらのことは、徹底的に分析して適切な提案を行うために、コードの綿密な検査と可用性を明らかに必要とします。それでも、それが常に可能であるとは限らず、以下に提供する情報に基づいて、良いヒントを提供できることを願っています。
リスナースレッドを使用して着信データをリッスンするサーバーアプリケーションがあります。着信データはアプリケーション固有のメッセージに解釈され、これらのメッセージによってイベントが発生します。
その時点まで、私は物事がどのように行われるかを実際に制御することはできません。
これはレガシーアプリケーションであるため、これらのイベントは以前は同じリスナースレッド(主にシングルスレッドアプリケーション)によって処理されていました。イベントはブラックボックスに送信され、ディスクに書き込む必要のある結果が出力されます。
スループットを向上させるために、イベントを処理するためにスレッドプールを採用したいと思いました。リスナースレッドは、イベントが作成されるたびに新しいタスクを生成でき、スレッドがブラックボックスの呼び出しを処理するという考え方です。最後に、ディスクへの書き込みを実行するバックグラウンドスレッドがあります。
以前のセットアップとバックグラウンドライターだけで、すべてが正常に機能し、スループットは以前の約1.6倍になります。
ただし、スレッドプールを追加すると、パフォーマンスが低下します。最初はすべてがスムーズに実行されているように見えますが、しばらくするとすべてが非常に遅くなり、最終的にOutOfMemoryExceptionsが発生します。奇妙なことに、タスクがプールに追加されるたびにアクティブなスレッドの数を出力すると(キューに入れられているタスクの数などの情報とともに)、スレッドプールが問題なく対応しているように見えます。プロデューサー(リスナースレッド)。
top -Hを使用してCPU使用率をチェックすると、最初は非常に均等に分散されますが、最終的にはワーカースレッドがほとんどアクティブにならず、リスナースレッドのみがアクティブになります。それでも、それ以上のタスクを送信していないようです...
誰かがこれらの症状の理由を推測できますか?複数のスレッドが追加されたときに、レガシーコード(私が制御できないもの)に何かがうまくいかない可能性が高いと思いますか?メモリ不足の問題は、どこかのキューが大きくなりすぎたために発生するはずですが、スレッドプールにキューに入れられたタスクが含まれることはほとんどないため、それは不可能です。
どんなアイデアでも大歓迎です。特に、このような状況をより効率的に診断する方法のアイデア。スレッドが実行していることなどについて、より良いプロファイルを取得するにはどうすればよいですか。
ありがとう。
java - jvisualvm が特定のメソッドを CPU プロファイリングから除外しない
jvisualvm でアプリケーションのプロファイルを作成しようとしています。アプリケーションはループで構成されており、データベースからデータがロードされ、そのデータに対していくつかの複雑な計算が実行されます。データのセットが処理されると、次のセットがロードされて計算されます。
アプリケーションを起動して jvisualvm をアタッチすると、CPU プロファイリング ページ (「クラスからの Sart プロファイリング」および「クラスをプロファイリングしない」) でフィルターを設定します。これは、データベース アクセスに関連するものには関心がないためです。その他の入出力関連のもの。
フィルターは機能します - ほとんど。sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
私の問題は、 sun.* が「クラスをプロファイルしない」フィルターに入力されているにもかかわらず、ほとんどの時間が に費やされているとプロファイラーが報告することです。これは、プロファイリング結果に表示される sun.* の唯一のメソッドです。
誰もこれを以前に見たことがあり、それを取り除く方法を知っていますか? 問題は、他のすべての方法が [セルフ時間] 列にごくわずか (<1%) しか表示されず、ほとんどが 0% で表示されることです。
使用される jvisualvm のバージョンは 1.3.2 です。
前もってありがとう、アクセル
java - CPUプロファイリングのフィルタリングクラスはJavaVisualVMで機能しますか?
Java VisualVm(バージョン1.7.0 b110325)でCPUプロファイルされているクラスをフィルタリングしたいと思います。このために、[プロファイラー]->[設定]->[CPU-設定]で、テスト対象のパッケージに[プロファイルのみのクラス]を設定しようとしましたが、効果はありませんでした。次に、「クラスのプロファイルを作成しない」に設定して、すべてのjava。*クラスとsun。*クラスを削除しようとしましたが、どちらも効果がありませんでした。
これは単なるバグですか?それとも私は何かが足りないのですか?回避策はありますか?私は以外を意味します:
- より良いプロファイラーにお金を払う
- 手作業でサンプリングを行う(プロファイラーを使用できるが、プログラムを停止しないのはなぜですか?を参照) 。
- コールツリービューに切り替えます。これは、プロファイラービューのみがメソッドごとに消費されたCPUのパーセンテージを表示するため、適切ではありません。
これは主に、メソッドごとに消費されたCPUの半分の正しいパーセンテージを取得するために実行したいと思います。このために、私は厄介な測定値を取り除く必要があります、例えばsun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(約70%)。多くのユーザーがこの問題を抱えているようです。
java - なぜ鋸歯状のグラフなのですか?
NetBeans を使用して以下のコードを実行すると、割り当てられたヒープ サイズのグラフが鋸歯状になります。ヒープ割り当てグラフを鋸歯状で示す JVisualVM のスクリーン キャプチャを添付します。プログラムは、「Hello, World!」を出力する単純な無限ループです。コンソールに。
使用済みヒープのグラフの形状の背後にある理由を説明できる人はいますか?
PS : これは、NetBeans を使用せずに実行しても発生するため、NetBeans とは関係ない可能性が高いです...
java - VMWareの下でWindows上でvisualvmを実行するのに助けが必要
VMWare Fusion 3.x(OSX)内で実行されているWindows7x64でJava開発を行っています。JDK6(アップデート26)をインストールし、JAVA_HOMEをパス(末尾にスラッシュなし)に設定して、コマンドプロンプトを再起動しました。
プログラムを正常に起動できます。起動時にキャリブレーションを実行し、次のエラーで失敗します。
「directory\VMWare-host \ SharedFolders \ .nbprofilerを作成できませんでした」(そのスラッシュの後にスペースはありませんが、マークアップはピリオドを隠していました)
クリックして続行できますが、プログラムに参加しているときは、CPUまたはメモリのプロファイリングを実行できません。同様のエラーボックスを表示します。
「ターゲットJVMの保存されたキャリブレーションデータの取得中にエラーが発生しました:作成できませんでした...(以前と同じ)」
昔々、起動時に--userdirフラグと-J-Dnbprofiler.homeを渡すことでこれを機能させていましたが、そのトリックはもう機能していません。
(完全なコマンドは次のとおりです。jvisualvm--userdir c:\ Users \ myname -J-Dnbprofiler.home = c:\ Users \ myname)
jvisualvmにキャリブレーションデータをvmwareネットワークドライブではなく「実際の」ドライブに保存させて、これを機能させるにはどうすればよいですか?
java - JVisualVM メモリ サンプリング : リモート アプリケーションはサポートされていません
Red Hat Linux で JVisualVM を使用してリモート tomcat プロセスを監視しようとしています。CPU サンプリングは正常に機能しますが、[メモリ サンプリング] タブが無効になっています。「メモリ サンプリング: 利用できません。リモート アプリケーションはサポートされていません」と表示されます。
プロセスのコマンド ライン パラメータ:
JVisualVm の詳細:
私が見逃しているものはありますか?私はこれらすべてにまったく慣れていません。
java - Tomcat org.apache.catalina.connector.requestfacade.getsession()は44.7%以上のCPUリソースを使用します
ステートレスJavaサーブレットWebアプリケーションを構築しました。要件は、1秒あたり少なくとも5000トランザクション(150の同時スレッド)を受け入れることです。遅いハードディスクへの書き込みを避けるために、SQLServer2005と一緒にehcacheを使用しています。
パフォーマンステスト(Jmeter 150スレッドを使用)では、1秒あたり約2800トランザクションしかスコアリングできません(予想の半分未満)。JVisualVM内でサンプラーを使用すると、次のことに気付きます。
requestfacade.getsession()は何をしていて、それを高速化する方法はありますか?コードを最適化する必要がありますが、それでも上記の行が何をしているのかを理解する必要があります。それ以外の場合、1秒あたり5000は実際には不可能です。
Tomcat conf:
-単一のTomcatインスタンス(6.0.23)-150maxThreadでConnectirエグゼキューターを使用
サーバー設定:
-Windows 2008
-xeonクアッドコア
-8GBのRAM
-1TB RAID 5 HDD
どんな助けでも感謝しなければなりません!
java - jvisualvmにヒープをダンプするときに、Runnableへの「Javaフレーム」GCルート参照を削除するにはどうすればよいですか?
jvisualvm
アプリケーションのメモリリークをチェックするために使用しています。ヒープダンプを実行すると、ガベージコレクションされているはずのいくつかのオブジェクトが開いたままになっていることがあります。
それらに対して「ShowNearestGCRoot」コマンドを実行すると、ルートが、Runnableインターフェイスを実装する定義済みのクラスであることが示されます。参照はとしてリストされていますが(java frame)
、これはスレッド化と関係があることを私は知っています。このノードのツリーを展開すると、ツリーが開いて表示されます<no references>
。したがって、これは私が開いたままにしている参照ではなく、Javaの内部にあるものであることは明らかです。
jvisualvmにリストされているGCRootオブジェクトは、タイプAnalyticNode extends Node
がですNode implements Runnable
。このルートオブジェクトは、「フレーム」という言葉が使用されているにもかかわらず、AWT、Swing、またはヘビーウェイトのユーザーインターフェイスコンポーネントとはまったく関係がありません。この場合、「フレーム」という言葉はスレッディングを指します。
では、Javaは、これを開いたままにする最後のRunnableへの参照をどこかに保持しますか?ヒープダンプのために適切にガベージコレクションできるように、この参照を解放するようにJavaに指示する方法はありますか?
何が起きてる?