問題タブ [visualvm]
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メモリ使用量/スレッドプールパフォーマンスの問題
これらのことは、徹底的に分析して適切な提案を行うために、コードの綿密な検査と可用性を明らかに必要とします。それでも、それが常に可能であるとは限らず、以下に提供する情報に基づいて、良いヒントを提供できることを願っています。
リスナースレッドを使用して着信データをリッスンするサーバーアプリケーションがあります。着信データはアプリケーション固有のメッセージに解釈され、これらのメッセージによってイベントが発生します。
その時点まで、私は物事がどのように行われるかを実際に制御することはできません。
これはレガシーアプリケーションであるため、これらのイベントは以前は同じリスナースレッド(主にシングルスレッドアプリケーション)によって処理されていました。イベントはブラックボックスに送信され、ディスクに書き込む必要のある結果が出力されます。
スループットを向上させるために、イベントを処理するためにスレッドプールを採用したいと思いました。リスナースレッドは、イベントが作成されるたびに新しいタスクを生成でき、スレッドがブラックボックスの呼び出しを処理するという考え方です。最後に、ディスクへの書き込みを実行するバックグラウンドスレッドがあります。
以前のセットアップとバックグラウンドライターだけで、すべてが正常に機能し、スループットは以前の約1.6倍になります。
ただし、スレッドプールを追加すると、パフォーマンスが低下します。最初はすべてがスムーズに実行されているように見えますが、しばらくするとすべてが非常に遅くなり、最終的にOutOfMemoryExceptionsが発生します。奇妙なことに、タスクがプールに追加されるたびにアクティブなスレッドの数を出力すると(キューに入れられているタスクの数などの情報とともに)、スレッドプールが問題なく対応しているように見えます。プロデューサー(リスナースレッド)。
top -Hを使用してCPU使用率をチェックすると、最初は非常に均等に分散されますが、最終的にはワーカースレッドがほとんどアクティブにならず、リスナースレッドのみがアクティブになります。それでも、それ以上のタスクを送信していないようです...
誰かがこれらの症状の理由を推測できますか?複数のスレッドが追加されたときに、レガシーコード(私が制御できないもの)に何かがうまくいかない可能性が高いと思いますか?メモリ不足の問題は、どこかのキューが大きくなりすぎたために発生するはずですが、スレッドプールにキューに入れられたタスクが含まれることはほとんどないため、それは不可能です。
どんなアイデアでも大歓迎です。特に、このような状況をより効率的に診断する方法のアイデア。スレッドが実行していることなどについて、より良いプロファイルを取得するにはどうすればよいですか。
ありがとう。
java - JFreeChartヒープスペース
JFreeChartがヒープをスラッシングするのを防ぐ方法があるのか、それともそれほど多くのことを行わない代替手段があるのか、私はただ疑問に思っています。SpreadsheetDate
、Millisecond
およびDay
ヒープの約70 MBを占有していますが、ガベージコレクターもおそらくスラッシングされています。全体として、彼らは私のアプリのヒープスペースの最大のユーザーです。12MBを使用するTimeSeriesDataItemもあります。これは、すべてのチャートについて、200ミリ秒ごとに記録することです。
また、ユーザーがUIでアイテムをクリックして表示した場合にのみ、すぐには使用されないかなりの数のデータセットを更新/保存しています。
また、ビジュアルVMで、メモリサンプラーテーブルの特定のクラス名が原因でガベージコレクションのスラッシングが多く表示される可能性はありますか?
乾杯、
クリス
java - visualgcを表示して、jvisualvmでTomcatを監視するにはどうすればよいですか?
次のことを再確認しました。
- Tomcat が実行されているのと同じボックスで jvisualvm を実行しています。
- これは Java 6u19 です。
- Tomcat サービスは、ログインしているのと同じユーザーとして実行されています。
- Tomcat サービスは、jvisualvm を使用しているのとまったく同じ JVM ディレクトリを使用しています。
- Tomcat は特定のポートで JMX を有効にしていますが、これは役に立たないと思います。
これで、Tomcat プロセスがjvisualvm の「ローカル」リストに表示されます。「<不明なアプリケーション> (pid 5644)」と表示されます。それをダブルクリックすると、すべてのタブに「この JVM ではサポートされていません」と表示されます。ただし、VisualVMは「ローカル」に表示され、すべてのタブが機能し、明らかに同じJVMインスタンスを使用しています。「<不明なアプリケーション>」インスタンスに JMX 接続を追加する明らかな方法はありません。
「Local」に「localhost:(my port number)」として Tomcat の JMX インスタンスが表示されますが、これは機能しますが、Visual GC タブには「この JVM ではサポートされていません」と表示されます。 JMX 経由で動作します。
私は何を間違っていますか?jstatd を起動してみました。違いはありませんでした。jstatd を起動すると、visualvm は「ローカル」「jstatd」を認識しますが、それをダブルクリックすると、他の Java プロセスではなく、その jstatd プロセスを監視しているように見えます。
注: Tomcat をサービスとしてではなく、CMD ウィンドウで直接実行することにしました。viola では、visualvm が完全に機能するようになりました。「jps」を実行して「プロセス情報が利用できません」という苦情が出たときにこれを試してみようと思い、それについてGoogleで検索したところ、Javaアプリをサービスとして実行したときにこれを取得したと言う人を見つけました。これはテストベッドでは役立ちますが、実稼働システムを監視する方法を理解するのには役立ちません。
これは、Windows Server 2003 の Tanuki ラッパーの下で Windows サービスとして実行されている Tomcat です。
java - VisualVM - 有効なコア ダンプではありません
JVM OutOfMemory (JDK 1.5 バージョン) から生成された .hprof ヒープ ダンプがあります。
このファイルを VisualVM に追加しようとすると、ファイルが有効なコア ダンプではないことがわかります。
ただし、このダンプ ファイルに対して jhat を問題なく実行できます。
なぜアイデアはありますか?
java - VisualVM での Java プログラム実行全体のプロファイリング
Java プロファイリングでは、最近ではすべての (無料の) 道が JDK6 に含まれる VisualVM プロファイラーにつながっているようです。それは素晴らしいプログラムのように見え、誰もが「実行中のプロセスにアタッチする」ことができることを主な機能として宣伝しています。問題は、それがローカル プロセスで使用する唯一の方法であるように思われることです。プロファイラーでプログラムを開始し、その実行全体を追跡できるようにしたいと考えています。
how to profile application startup with visualvm-Xrunjdwp
で説明されているオプションを使用してみましたが、2 つの転送方法 (共有メモリとサーバー) の間では、どちらも役に立ちません。VisualVM は前者との統合がないようで、VisualVM はまたはへの接続を拒否するため、後者もダメです。また、プログラムに単純な読み取りを挿入して実行の一時停止を挿入しようとしましたが、その場合、VisualVM は読み取りが完了するまでブロックし、実行が開始されるまでプロファイリングを開始できません。 Eclipseプラグインも調べてみましたが、Webサイトにはリンク切れが多く、使用しようとするとランチャーがクラッシュするだけですlocalhost
127.0.0.1
System.in
(これはもはや正確ではないかもしれません)。NullPointerException
C 出身の私にとって、これは特に難しい作業ではないように思えます。何か足りないだけですか、それとも本当に不可能なリクエストですか? 別の (これも無料の) プロファイラーを使用するなど、あらゆる種類の提案を受け入れます。また、コマンド ラインも嫌いではありません。
performance - TeraSort マップ フェーズが CRC32.update() 関数でかなりの時間を費やしているのはなぜですか?
TeraSort Hadoop ジョブで最も多くの時間を消費する関数をプロファイリングしようとしています。私のテスト システムでは、基本的な 1 ノードの疑似分散セットアップを使用しています。これは、NameNode、DataNode、Tasktracker、および Jobtracker JVM がすべて同じマシンで実行されることを意味します。
最初に TeraGen を使用して ~9GB のデータを生成し、次に TeraSort を実行します。JVM が実行されている間、VisualVM を使用してその実行をサンプリングします。これが最も正確なプロファイラーではないことはわかっていますが、無料で使いやすいです! 私は最新バージョンの Apache Hadoop ディストリビューションを使用しており、私の実験は Intel Atom ベースのシステムで実行されています。
VisualVM のホット スポット メソッドのセルフ タイム (CPU) を見ると、java.util.zip.CRC32.update() 関数が合計時間の約 40% を占めていることがわかります。コール ツリーでこの関数を見ると、特に IdentityMapper.map() が HDFS から入力ファイルを読み取っているときに、マッパーの main() 関数によって呼び出されます。CRC32.update() 関数を実際に呼び出す関数は、org.apache.hadoop.fs.FSInputChecker.readChecksumChunk() です。
これに関して 3 つの質問があります。
HDFS から読み取られるブロックの CRC32 チェックサムが更新されるのはなぜですか? 私が正しく理解している場合、ブロックが読み取られると、ブロックのCRC値を生成および更新するのではなく、ディスクから読み取られたデータとブロックのCRCとの単純な比較が唯一の操作になるはずです。
update 関数のソースを調べたところ、java.util.zip.CRC32.java ファイルによって実装されています。呼び出される特定の関数は、3 つの引数を持つオーバーロードされた update() メソッドです。この関数は Java で実装されているため、複数の抽象化レイヤー (Hadoop、JVM、CPU 命令) が CRC 計算のネイティブ効率を低下させている可能性はありますか?
最後に、私の VisualVM 計測方法、またはサンプリング結果の解釈に重大な問題がありますか?
ありがとう、
java - VisualVM を使用してボトルネック/問題を特定する方法
Web アプリケーションを 5 日間実行するとパフォーマンスが低下する に投稿したように、ボトルネックを特定するにはどうすればよいですか? 、しばらく実行するとアプリケーションが遅くなるという問題があります。
VisualVM を実行して、異なる時間の間のスナップショットを作成しました。現在、アプリケーションは非常に遅いですが、ボトルネックを特定する方法がわかりません。お互いに大きな違いはありません。わずかに増加するのはヒープだけで、しばらくするとガベージ コレクションが正常に行われます。
誰かが私にいくつかの指針を与えることができますか?
スナップショット (アプリ) は次のとおりです。
[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html
[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html
ありがとうございました!
編集: よく見ると、CPU があまり使用されていないことに気付きました..そして、システムは本当に遅いです!
java - CPUプロファイリングのフィルタリングクラスはJavaVisualVMで機能しますか?
Java VisualVm(バージョン1.7.0 b110325)でCPUプロファイルされているクラスをフィルタリングしたいと思います。このために、[プロファイラー]->[設定]->[CPU-設定]で、テスト対象のパッケージに[プロファイルのみのクラス]を設定しようとしましたが、効果はありませんでした。次に、「クラスのプロファイルを作成しない」に設定して、すべてのjava。*クラスとsun。*クラスを削除しようとしましたが、どちらも効果がありませんでした。
これは単なるバグですか?それとも私は何かが足りないのですか?回避策はありますか?私は以外を意味します:
- より良いプロファイラーにお金を払う
- 手作業でサンプリングを行う(プロファイラーを使用できるが、プログラムを停止しないのはなぜですか?を参照) 。
- コールツリービューに切り替えます。これは、プロファイラービューのみがメソッドごとに消費されたCPUのパーセンテージを表示するため、適切ではありません。
これは主に、メソッドごとに消費されたCPUの半分の正しいパーセンテージを取得するために実行したいと思います。このために、私は厄介な測定値を取り除く必要があります、例えばsun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(約70%)。多くのユーザーがこの問題を抱えているようです。
java - VisualVM を使用して -javaagent で起動された Java アプリケーションを検査する
VisualVM を使用して Java アプリケーションを検査しようとしています。通常は問題ありませんが、Eclipselink ウィービングをセットアップしようとしているので、-javaagent フラグを使用してプログラムを開始しています。
Viusal VM を使用してプログラムを見ると、[監視] ページに何も表示されません。
残念ながら、VisualVM ドキュメント サイト (visualvm.java.net) はダウンしているようです。
私が間違っていることを理解するのを手伝ってくれる人に感謝します。
jvm - hprof で「参照なし」のオブジェクト
hprof
VisualVM でファイルを調査しています
サーバーは JDK 1.4.2_30 を実行しており、NewSize が 200 Mb の 1 GB ヒープがあります。
hprof は、ヒープの 71% が の 56000 インスタンスによって占められていることを示してint[]
おり、VisualVM で表示すると、これらの 56K 配列のどれも参照を持っていません。
私たちによると、「参照がない」場合、これはガベージコレクションされているはずです。質問は次のとおりです。
a)これらの参照を見つける方法はありますか?
b) これは不適切なスナップショットですか? つまり、ヒープ ダンプを取得するアクションで何らかの GC が実行されましたか?
c) VisualVM の「保持サイズ」オブジェクトを確認する必要がありますか?
更新情報として- これらが何であるかはまだわかりませんint[]
が、次に大きなオブジェクトはプール内の Weblogic 内部 EJB 参照であり、以前の頻繁なフル GC からメモリ使用率を 30% に低下させた不適切な設定を発見しました。