[java] Java에서 CPU 및 메모리 사용량을 어떻게 확인합니까?

Java에서 서버의 CPU 및 메모리 사용량을 확인해야합니다. 어떻게 할 수 있는지 아는 사람이 있습니까?



답변

JVM에서 특별히 메모리를 찾고 있다면 :

Runtime runtime = Runtime.getRuntime();

NumberFormat format = NumberFormat.getInstance();

StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();

sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");

그러나 이것은 추정치로만 취해야합니다 …


답변

package mkd.Utils;

import java.io.File;
import java.text.NumberFormat;

public class systemInfo {

    private Runtime runtime = Runtime.getRuntime();

    public String Info() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.OsInfo());
        sb.append(this.MemInfo());
        sb.append(this.DiskInfo());
        return sb.toString();
    }

    public String OSname() {
        return System.getProperty("os.name");
    }

    public String OSversion() {
        return System.getProperty("os.version");
    }

    public String OsArch() {
        return System.getProperty("os.arch");
    }

    public long totalMem() {
        return Runtime.getRuntime().totalMemory();
    }

    public long usedMem() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }

    public String MemInfo() {
        NumberFormat format = NumberFormat.getInstance();
        StringBuilder sb = new StringBuilder();
        long maxMemory = runtime.maxMemory();
        long allocatedMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        sb.append("Free memory: ");
        sb.append(format.format(freeMemory / 1024));
        sb.append("<br/>");
        sb.append("Allocated memory: ");
        sb.append(format.format(allocatedMemory / 1024));
        sb.append("<br/>");
        sb.append("Max memory: ");
        sb.append(format.format(maxMemory / 1024));
        sb.append("<br/>");
        sb.append("Total free memory: ");
        sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
        sb.append("<br/>");
        return sb.toString();

    }

    public String OsInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("OS: ");
        sb.append(this.OSname());
        sb.append("<br/>");
        sb.append("Version: ");
        sb.append(this.OSversion());
        sb.append("<br/>");
        sb.append(": ");
        sb.append(this.OsArch());
        sb.append("<br/>");
        sb.append("Available processors (cores): ");
        sb.append(runtime.availableProcessors());
        sb.append("<br/>");
        return sb.toString();
    }

    public String DiskInfo() {
        /* Get a list of all filesystem roots on this system */
        File[] roots = File.listRoots();
        StringBuilder sb = new StringBuilder();

        /* For each filesystem root, print some info */
        for (File root : roots) {
            sb.append("File system root: ");
            sb.append(root.getAbsolutePath());
            sb.append("<br/>");
            sb.append("Total space (bytes): ");
            sb.append(root.getTotalSpace());
            sb.append("<br/>");
            sb.append("Free space (bytes): ");
            sb.append(root.getFreeSpace());
            sb.append("<br/>");
            sb.append("Usable space (bytes): ");
            sb.append(root.getUsableSpace());
            sb.append("<br/>");
        }
        return sb.toString();
    }
}


답변

Sun JVM을 사용하고 있고 애플리케이션의 내부 메모리 사용량 (앱이 사용중인 할당 된 메모리 중 얼마나 많은 양)에 관심이 있다면 JVM 내장 가비지 수집 로깅을 사용하는 것을 선호합니다. 시작 명령에 -verbose : gc를 추가하기 만하면됩니다.

Sun 문서에서 :

명령 줄 인수 -verbose : gc는 모든 컬렉션에서 정보를 인쇄합니다. -verbose : gc 출력의 형식은 J2SE 플랫폼의 릴리스간에 변경 될 수 있습니다. 예를 들어, 다음은 대규모 서버 애플리케이션의 출력입니다.

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

여기서 우리는 두 개의 마이너 컬렉션과 하나의 메이저 컬렉션을 볼 수 있습니다. 화살표 앞뒤의 숫자

325407K->83000K (in the first line)

각각 가비지 수집 전후의 라이브 개체의 결합 된 크기를 나타냅니다. 마이너 컬렉션 후 카운트에는 반드시 살아있을 필요는 없지만 회수 할 수없는 개체가 포함됩니다. 개체가 직접 살아 있기 때문이거나 보유 세대 내에 있거나 참조되기 때문입니다. 괄호 안의 숫자

(776768K) (in the first line)

영구 세대의 공간을 계산하지 않고 사용 가능한 총 공간으로, 총 힙에서 생존자 공간 중 하나를 뺀 값입니다. 마이너 컬렉션은 약 1/4 초가 걸렸습니다.

0.2300771 secs (in the first line)

자세한 내용은 http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html을 참조하십시오.


답변

에서 여기

    OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
    long prevUpTime = runtimeMXBean.getUptime();
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
    double cpuUsage;
    try
    {
        Thread.sleep(500);
    }
    catch (Exception ignored) { }

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    long upTime = runtimeMXBean.getUptime();
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
    long elapsedCpu = processCpuTime - prevProcessCpuTime;
    long elapsedTime = upTime - prevUpTime;

    cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
    System.out.println("Java CPU: " + cpuUsage);


답변

JMX, 제공된 MXBean (ThreadMXBean 등)은 메모리 및 CPU 사용량을 제공합니다.

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();


답변

메모리 사용량의 경우 다음이 작동합니다.

long total = Runtime.getRuntime().totalMemory();
long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

CPU 사용량의 경우이를 측정하기 위해 외부 애플리케이션을 사용해야합니다.


답변

Java 1.5부터 JDK에는 새로운 도구가 함께 제공됩니다. JConsole 은 1.5 이상의 JVM의 CPU 및 메모리 사용량을 보여줄 수 있습니다. 이러한 매개 변수의 차트를 수행하고 CSV로 내보내고로드 된 클래스 수, 인스턴스 수, 교착 상태, 스레드 등을 표시 할 수 있습니다.