2012-02-22 16 views
1

おそらく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スクリプトを書く可能性は常にあると認識していますが、この情報にプログラムで直接アクセスするよりも時間がかかります(実装がもっと複​​雑です)。

+1

c#でdllを作成し、java com bridgeを使用してjavaから呼び出します。 – Shahzeb

+1

これは最も簡単な解決策かもしれません。なぜなら、このようなことはC#で手に入るのは些細なことだからです。 – Eddie

答えて

0

WinPack.jarライブラリdirecltyがこの情報を提供しています。私はこれを見つけるのを助けたドキュメントは見つかりませんでした。そのAPIドキュメントを見て実験してみると、私はこのコードを考え出すことができました。あなたは、ライブラリの最新バージョンを使用している場合MemoryInfoMemoryStatusを置き換えます。これは私が探しています何を私に与え

import com.jniwrapper.win32.system.MemoryStatus; 

... 

private void test() { 
    MemoryStatus mStatus = new MemoryStatus(); 
    System.out.println("TotalVirtual: " + getBytesInMB(mStatus.getTotalVirtual()) + " MB"); 
    System.out.println("AvailVirtual: " + getBytesInMB(mStatus.getAvailVirtual()) + " MB"); 
    System.out.println("UsedVirtual: " + getBytesInMB(mStatus.getTotalVirtual() - mStatus.getAvailVirtual()) + " MB"); 
} 

private long getBytesInMB(final long input) { 
    return input/1024/1024; 
} 

- このコードを実行しているJavaプロセスの仮想アドレス空間の使用状況。これは汎用的な解決策ではありませんが、同じ種類の情報を記録したい他の人に役立つかもしれません。

関連する問題