[java] OS 수준의 시스템 정보 얻기

나는 현재 많은 다른 플랫폼에서 실행될 수 있지만 주로 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();
        }
    }
}


답변

가장 좋은 방법은 HypericSIGAR API 를 구현하는 입니다. 그것은 대부분의 주요 운영 체제에서 작동하며 (현대적으로 거의 다름) 작업하기가 매우 쉽습니다. 개발자는 포럼 및 메일 링리스트에 매우 반응이 좋습니다. 또한 GPL2 Apache 라이센스가있는 것이 좋습니다. Java에서도 많은 예제를 제공합니다!

SIGAR == 시스템 정보, 수집 및보고 도구.


답변

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));
}