2012-02-22 2 views
1

아마 jniwrap.jar and winpack.jar을 사용하고 있기 때문에 자체 JNI 코드를 굴릴 필요가 없습니다. Java 서비스의 "Virtual Bytes"성능 카운터를 어떻게 읽을 수 있습니까? 이 서비스는 자체 성능 카운터를 읽어 가상 주소 공간의 사용량을 주기적으로 기록 할 수 있습니다. 현재 OS JMX MBean에서 반환 한 JMX 값 "CommittedVirtualMemorySize"를 기록하지만 이는 이 커밋 된 인 메모리 양만 표시하므로 가상 주소 공간을 소진할지 여부를 이해하는 데 도움이되지 않습니다.Java 프로세스에서 Java의 Windows "Virtual Bytes"성능 카운터를 읽으려면 어떻게해야합니까?

이는 Java 컴파일러 스레드가 C 힙을 소모하여 프로세스의 전체 JVM을 충돌시키는 Java 기반 서버 프로세스를위한 것입니다. 내 자신의 코드는 범인이 아닙니다. JVM 자체입니다. 그러나이 진단 데이터는 서비스의 전체 가상 주소 공간 요구 사항을 이해하는 데 도움이됩니다.

편집 :이 질문을 한 이후로 지금까지는 여러 가지 시도를 해 보았습니다. winpack.jar는 레지스트리 액세스를 허용하고 레지스트리와 같은 액세스를 통해 성능 데이터에 대한 액세스를 제공하는 레지스트리 키 RegistryKey.PERFORMANCE_DATA이 있지만 항상 키가 없습니다. VB에서이 메서드를 사용하여 성능 데이터를 얻은 일부 sample code을 찾았습니다. 심지어 해당 코드를 사용해도 데이터가 반환되지 않았습니다. 이것은 Win7Pro 바탕 화면에 있습니다. 이 데이터는 기본적으로 사용할 수 없습니까? '

PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "Virtual Bytes"; 
PC.InstanceName = "Java#1"; 
PC.ReadOnly = true; 
float VirtualBytes = PC.NextValue(); 

하지만 난 할 수 있습니다 내가 작업하는 방법을 얻을 수없는 경우

후 나는 유일한 선택은 어떻게 든이 C# 코드에 자바 동등한 코드를 실행 jniwrap를 사용하거나 winpack하려고 생각 이것을하기위한 좋은 방법을 생각해보십시오. 누구나 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; 
} 

-이 코드를 실행하는 자바 프로세스의 가상 주소 공간 사용. 일반적인 목적의 솔루션은 아니지만 같은 종류의 정보를 기록하려는 다른 사람들에게 도움이 될 수 있습니다.

관련 문제