サーバーの CPU とメモリの使用量を Java で確認する必要があります。
16 に答える
特に 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/>");
ただし、あくまでも目安としてお考えください...
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)
それぞれ、ガベージ コレクション前後のライブ オブジェクトの合計サイズを示します。マイナー コレクションの後、カウントには、必ずしも生きているとは限らないが、直接生きているか、Tenured 世代内にあるか、Tenured 世代から参照されているために再利用できないオブジェクトが含まれます。括弧内の数字
(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は、1.5 以降の JVM の CPU とメモリの使用状況を表示できます。これらのパラメータのグラフを作成したり、CSV にエクスポートしたり、ロードされたクラスの数、インスタンスの数、デッドロック、スレッドなどを表示したりできます...
ここで多くの回答に投稿されているランタイム/合計メモリ ソリューションを使用する場合 (私はそれを何度も行いました)、かなり正確で一貫した結果が必要な場合は、最初に 2 つのガベージ コレクションを強制してください。
効率化のために、Java は通常、GC を強制する前にガベージがすべてのメモリを埋めることを許可しますが、それでも通常は完全な GC ではないため、runtime.freeMemory() の結果は常に「実際の」空きメモリ量と 0 の間のどこかにあります。 .
最初の GC はすべてを取得するのではなく、ほとんどを取得します。
上昇傾向にあるのは、freeMemory() 呼び出しを実行するだけではまったく役に立たず、大きく変動する数値が得られることですが、最初に 2 つの gc を実行すると、非常に信頼できるゲージになります。また、ルーチンが非常に遅くなります (おそらく数秒)。
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));
JConsoleは、実行中の Java アプリケーションを監視する簡単な方法です。また、プロファイラーを使用して、アプリケーションに関する詳細情報を取得することもできます。これにはNetBeans Profilerを使用するのが好きです。
YourKit Java プロファイラーは、優れた商用ソリューションです。詳細については、 CPU プロファイリングとメモリ プロファイリングに関するドキュメントを参照してください。
Tomcat を使用している場合は、Psi Probeを確認してください。これにより、内部および外部のメモリ消費や、他の多くの領域を監視できます。
Eclipse の場合、TPTP (Test and Performance Tools Platform) を使用してメモリ使用量などを分析できます。詳細情報
既存の回答にメモを追加したい:
これらのメソッドは、JVM メモリのみを追跡します。実際のプロセスは、より多くのメモリを消費する場合があります。
java.nio.ByteBuffer.allocateDirect() は関数/ライブラリであり、見逃されがちであり、実際に割り当てられたネイティブ メモリであり、Java メモリ管理の一部ではありません。
Linux では、次のようなものを使用して、実際に消費されたメモリを取得できます: https://linuxhint.com/check_memory_usage_process_linux/