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();
}
}
freeMemory
여기는 매우 다른 JVM에서 사용 가능한 메모리 양을 반환합니다.
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);
operatingSystemMXBean.getProcessCpuLoad();
? Oracle 설명서에 따르면이 메서드는 "Java Virtual Machine 프로세스에 대한"최근 CPU 사용량 "을 반환합니다."를 반환합니다. 그러나 나는 당신의 방법과이 방법 사이에 상대적으로 큰 차이를 봅니다.
OperatingSystemMXBean
클래스가 있습니다. 하나는 java.lang
. 그러나 .NET에서이 버전을 확장하는 다른 버전도 있습니다 com.sun.management
. 그것이 제가 언급 한 방법입니다OperatingSystemMXBean
여기에 많은 답변에 게시 된 runtime / totalMemory 솔루션을 사용하는 경우 (많은 작업을 수행했습니다) 상당히 정확하고 일관된 결과를 원하면 먼저 두 개의 가비지 수집을 강제하십시오.
효율성을 위해 Java는 일반적으로 GC를 강제 실행하기 전에 가비지가 모든 메모리를 채울 수 있도록 허용하며 일반적으로 완전한 GC가 아니므로 runtime.freeMemory ()에 대한 결과는 항상 "실제"메모리 양과 0 사이의 어딘가에 있습니다. .
첫 번째 GC는 모든 것을 얻는 것이 아니라 대부분을 얻습니다.
상승세는 freeMemory () 호출 만하면 절대적으로 쓸모없고 광범위하게 변하는 숫자를 얻을 수 있다는 것입니다. 그러나 2 gc를 먼저 수행하면 매우 신뢰할 수있는 게이지입니다. 또한 루틴을 훨씬 느리게 만듭니다 (아마도 초).
JConsole 은 실행중인 Java 애플리케이션을 모니터링하는 쉬운 방법이거나 프로파일 러를 사용하여 애플리케이션에 대한 자세한 정보를 얻을 수 있습니다. 저는이를 위해 NetBeans Profiler 를 사용하는 것을 좋아 합니다.
또한 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();
}
여기에서 더 많은 것을 읽을 수 있습니다
Tomcat을 사용하는 경우 내부 및 외부 메모리 소비는 물론 다른 영역의 호스트를 모니터링 할 수있는 Psi Probe를 확인하십시오 .