나는 현재 많은 다른 플랫폼에서 실행될 수 있지만 주로 Solaris, Linux 및 Windows의 변형에서 실행될 수있는 Java 응용 프로그램을 만들고 있습니다.
누구든지 현재 사용 된 디스크 공간, CPU 사용률 및 기본 OS에서 사용 된 메모리와 같은 정보를 성공적으로 추출 할 수 있습니까? Java 앱 자체가 소비하는 것은 어떻습니까?
JNI를 사용하지 않고이 정보를 얻고 싶습니다.
답변
Runtime 클래스에서 제한된 메모리 정보를 얻을 수 있습니다. 그것은 실제로 당신이 찾고있는 것이 아니지만, 나는 완전성을 위해 그것을 제공 할 것이라고 생각했습니다. 다음은 작은 예입니다. 편집 : java.io.File 클래스에서 디스크 사용 정보를 얻을 수도 있습니다. 디스크 공간 사용량에는 Java 1.6 이상이 필요합니다.
public class Main {
public static void main(String[] args) {
/* Total number of processors or cores available to the JVM */
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
/* Total amount of free memory available to the JVM */
System.out.println("Free memory (bytes): " +
Runtime.getRuntime().freeMemory());
/* This will return Long.MAX_VALUE if there is no preset limit */
long maxMemory = Runtime.getRuntime().maxMemory();
/* Maximum amount of memory the JVM will attempt to use */
System.out.println("Maximum memory (bytes): " +
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
/* Total memory currently available to the JVM */
System.out.println("Total memory available to JVM (bytes): " +
Runtime.getRuntime().totalMemory());
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
/* For each filesystem root, print some info */
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
답변
java.lang.management의 패키지는 당신에게 런타임보다 훨씬 더 많은 정보를 준다 – 예를 들어 당신에게 힙 메모리를 줄 것이다 ( ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) (비 힙 메모리에서 분리 ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).
(자신의 JNI 코드를 작성하지 않고) 프로세스 CPU 사용량을 얻을 수도 있지만를로 캐스팅해야 java.lang.management.OperatingSystemMXBean
합니다 com.sun.management.OperatingSystemMXBean
. 이것은 Windows 및 Linux에서 작동하며 다른 곳에서는 테스트하지 않았습니다.
예를 들어 … 더 정확한 판독 값을 얻으려면 get getCpuUsage () 메소드를 더 자주 호출하십시오.
public class PerformanceMonitor {
private int availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
private long lastSystemTime = 0;
private long lastProcessCpuTime = 0;
public synchronized double getCpuUsage()
{
if ( lastSystemTime == 0 )
{
baselineCounters();
return;
}
long systemTime = System.nanoTime();
long processCpuTime = 0;
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );
lastSystemTime = systemTime;
lastProcessCpuTime = processCpuTime;
return cpuUsage / availableProcessors;
}
private void baselineCounters()
{
lastSystemTime = System.nanoTime();
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
}
}
답변
가장 좋은 방법은 Hyperic 의 SIGAR API 를 구현하는 것 입니다. 그것은 대부분의 주요 운영 체제에서 작동하며 (현대적으로 거의 다름) 작업하기가 매우 쉽습니다. 개발자는 포럼 및 메일 링리스트에 매우 반응이 좋습니다. 또한 GPL2 Apache 라이센스가있는 것이 좋습니다. Java에서도 많은 예제를 제공합니다!
답변
JNA를 사용하여 (설치할 기본 라이브러리가 없음) Java 프로젝트가 있으며 현재 개발 중입니다. 현재 Linux, OSX, Windows, Solaris 및 FreeBSD를 지원하며 RAM, CPU, 배터리 및 파일 시스템 정보를 제공합니다.
답변
창문의 경우 나는이 길을 갔다.
com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize = os.getTotalPhysicalMemorySize();
long freePhysicalMemory = os.getFreePhysicalMemorySize();
long freeSwapSize = os.getFreeSwapSpaceSize();
long commitedVirtualMemorySize = os.getCommittedVirtualMemorySize();
자세한 내용 이있는 링크 는 다음과 같습니다 .
답변
System.getenv()
관련 환경 변수 이름을 매개 변수로 전달하여을 사용하여 일부 시스템 수준 정보를 얻을 수 있습니다 . 예를 들어, Windows의 경우 :
System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")
다른 운영 체제의 경우 관련 환경 변수의 유무 및 이름이 다릅니다.
답변
maven을 통해 OSHI 종속성을 추가하십시오.
<dependency>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.2</version>
</dependency>
배터리 용량을 백분율로 표시하십시오.
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
for (PowerSource pSource : hal.getPowerSources()) {
System.out.println(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}