おそらくjniwrap.jar and winpack.jarを使用していますので、独自のJNIコードをロールアップする必要はありません。Javaサービスの「Virtual Bytes」パフォーマンスカウンタをどのように読み取ることができますか?サービスは、自身のパフォーマンスカウンタを読み取って、使用されている仮想アドレス空間の量を定期的にログに記録します。現在、OS JMX MBeanから返されたJMX値 "CommittedVirtualMemorySize"がログに記録されますが、がコミットされたのメモリ量しか表示されないため、仮想アドレス空間を使い切っているかどうかはわかりません。JavaプロセスでWindowsの "Virtual Bytes"パフォーマンスカウンタをJavaで読み取るにはどうすればよいですか?
これは、JavaコンパイラスレッドがCヒープを使い果たしてプロセス内のJVM全体がクラッシュするJavaベースのサーバープロセス用です。私自身のコードは原因ではなく、JVM自体です。しかし、この診断データは、私がサービスの完全な仮想アドレス空間のニーズを理解するのに役立ちます。
編集:この質問をして以来、私はいくつかの異なることを試してきました。 winpack.jarはレジストリへのアクセスを許可し、レジストリのようなアクセスを介してパフォーマンスデータへのアクセスを提供すると思われるレジストリキーRegistryKey.PERFORMANCE_DATA
がありますが、私はいつもキーが戻っていません。 VBでsample codeという具合にこのメソッドを使ってパフォーマンスデータを取得しましたが、そのコードでもデータは返っていませんでした。これはWin7Proデスクトップにあります。このデータはデフォルトでは利用できませんか?
私はその方法は仕事を得ることができない場合は、私が唯一の他の選択肢は何とかこのC#コードへのJava同等でコードを実行するjniwrapまたはwinpackを使用しようとしていると思う:「
PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "Virtual Bytes";
PC.InstanceName = "Java#1";
PC.ReadOnly = true;
float VirtualBytes = PC.NextValue();
が、私はすることができますこれを行うには良い方法を考えてください。 Jniwrapper/winpackのどちらか、またはこれを行う方法を提案できるレジストリを介してパフォーマンスデータを取得することに慣れている人はいますか?
この情報を取得するために外部のC#プログラムまたはWMIスクリプトを書く可能性は常にあると認識していますが、この情報にプログラムで直接アクセスするよりも時間がかかります(実装がもっと複雑です)。
c#でdllを作成し、java com bridgeを使用してjavaから呼び出します。 – Shahzeb
これは最も簡単な解決策かもしれません。なぜなら、このようなことはC#で手に入るのは些細なことだからです。 – Eddie