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]
ここには、2つのマイナーコレクションと1つのメジャーコレクションがあります。矢印の前後の数字
325407K->83000K (in the first line)
ガベージコレクションの前と後のライブオブジェクトの合計サイズをそれぞれ示します。マイナーコレクションの後、カウントには、必ずしも生きているわけではないが、直接生きているか、終身世代内にあるか参照されているために回収できないオブジェクトが含まれます。括弧内の数字
(776768K) (in the first line)
は、永続的な世代のスペースをカウントせずに使用可能な合計スペースです。これは、合計ヒープからサバイバースペースの1つを引いたものです。マイナーコレクションには約4分の1秒かかりました。
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 JVM。これらのパラメーターのチャートを作成し、CSVにエクスポートし、ロードされたクラスの数、インスタンスの数、デッドロック、スレッドなどを表示できます。
ここに多くの回答で投稿されたruntime/totalMemoryソリューションを使用する場合(私はそれをたくさんしました)、かなり正確で一貫した結果が必要な場合は、最初に2つのガベージコレクションを強制してください。
効率のためJavaは通常、GCを強制する前にガベージがすべてのメモリを一杯にすることを許可し、それでも通常は完全なGCではないため、runtime.freeMemory()の結果は常に「実際の」空きメモリの量と0。
最初のGCはすべてを取得するのではなく、ほとんどを取得します。
Upswingは、freeMemory()呼び出しを行うだけで、絶対に役に立たないさまざまな数値が得られることですが、最初に2 gcを実行すると非常に信頼できるゲージになります。また、ルーチンMUCHが遅くなります(場合によっては数秒)。
Javaの Runtime オブジェクトは、JVMのメモリ使用量を報告できます。 CPUを消費するには、UnixのtopやWindows Process Managerなどの外部ユーティリティを使用する必要があります。
以下は、現在のメモリ使用量をメガバイト単位で計算する簡単なコードです。
double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
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();
}
もっと読むことができます こちら
JConsole は、実行中のJavaアプリケーションを監視する簡単な方法です。または、プロファイラーを使用して、アプリケーションの詳細情報を取得できます。 NetBeans Profiler を使用するのが好きです。
YourKit Javaプロファイラーは、優れた商用ソリューションです。詳細については、 CPUプロファイリング および メモリプロファイリング のドキュメントを参照してください。
Tomcatを使用している場合は、 Psi Probe を確認してください。これにより、内部および外部のメモリ消費量と他の領域のホストを監視できます。
Eclipseの場合、TPTP(テストおよびパフォーマンスツールプラットフォーム)を使用してメモリ使用量などを分析できます。 詳細