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로 내보내고로드 된 클래스 수, 인스턴스 수, 교착 상태, 스레드 등을 표시 할 수 있습니다.