it-swarm-ko.tech

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

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

93
Johnny Bou

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/>");

그러나 이것들은 추정치로만 사용해야합니다 ...

69
Jeremy
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();
    }
}
19
Dave

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)

가비지 수집 전후에 라이브 객체의 결합 된 크기를 각각 나타냅니다. 소량의 수집 후에는 반드시 살아 있지 않지만 직접 살아 있거나 tenured 세대 내에 있거나 참조되어 있기 때문에 회수 할 수없는 개체가 포함됩니다. 괄호 안의 숫자

(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

17
unknown (yahoo)

에서 여기

    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);
15
danieln

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

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

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

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

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

8
Rich Adams

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

5
Telcontar

여기 많은 답변에 게시 된 런타임/totalMemory 솔루션을 사용하는 경우 (많은 작업을 수행했습니다) 상당히 정확하고 일관된 결과를 얻으려면 먼저 두 개의 가비지 콜렉션을 강제 실행하십시오.

효율성을 위해 Java는 일반적으로 GC를 강제 실행하기 전에 가비지가 모든 메모리를 채우도록 허용하며, 심지어는 완전한 GC가 아니므로 runtime.freeMemory ()에 대한 결과는 항상 "실제"사이에 있습니다 사용 가능한 메모리 양과 0.

첫 번째 GC는 모든 것을 얻지 못하고 대부분을 얻습니다.

Upswing은 freeMemory () 호출을 수행하면 절대적으로 쓸모없고 광범위하게 변하는 숫자를 얻을 수 있지만 2 gc를 먼저 수행하면 매우 안정적인 게이지입니다. 또한 일상적인 MUCH를 느리게 만듭니다 (초).

4
Bill K

Java의 런타임 객체는 JVM의 메모리 사용량을보고 할 수 있습니다. CPU 소비를 위해서는 Unix의 최상위 또는 Windows 프로세스 관리자와 같은 외부 유틸리티를 사용해야합니다.

3
moonshadow

다음은 메가 바이트 단위로 현재 메모리 사용량을 계산하는 간단한 코드입니다.

double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
2
Phil

또한 CPU로드를 추적하기 위해 다음과 같은 방법을 추가합니다.

import Java.lang.management.ManagementFactory;
import com.Sun.management.OperatingSystemMXBean;

double getCpuLoad() {
    OperatingSystemMXBean osBean =
        (com.Sun.management.OperatingSystemMXBean) ManagementFactory.
        getPlatformMXBeans(OperatingSystemMXBean.class);
    return osBean.getProcessCpuLoad();
}

더 읽을 수 있습니다 here

2
sbeliakov

JConsole 는 실행중인 Java 응용 프로그램을 모니터링하는 쉬운 방법이거나 프로파일 러를 사용하여 응용 프로그램에 대한 자세한 정보를 얻을 수 있습니다. 나는 이것을 위해 NetBeans Profiler 를 사용하는 것을 좋아합니다.

1
blahspam

YourKit Java 프로파일 러는 훌륭한 상용 솔루션입니다. CPU 프로파일 링메모리 프로파일 링 의 문서에서 추가 정보를 찾을 수 있습니다.

1
Gregg

Tomcat을 사용하는 경우 Psi Probe 를 확인하여 내부 및 외부 메모리 소비와 다른 영역의 호스트를 모니터링 할 수 있습니다.

1
Tim Howland

Eclipse의 경우 TPTP (Test and Performance Tools Platform)를 사용하여 메모리 사용량 등을 분석 할 수 있습니다. 자세한 정보

0
Fuangwith S.