JavaでCPUとメモリの使用状況を確認するにはどうすればよいですか?


97

JavaでサーバーのCPUとメモリの使用状況を確認する必要があります。誰でもそれを行う方法を知っていますか?


おそらく、これらのリンクは、参考になります:javaworld.com/javaworld/javaqa/2002-11/01-qa-1108-cpu.html roseindia.net/javatutorials/...
chessguy

回答:


73

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

ただし、これらはあくまでも目安としてください...


だから私がEclipseで実行している場合、これは私のEclipse設定に依存しますか?
コーヒー

4
これは実際に使用されるメモリではないことに注意してください。これは「割り当てられたメモリ」であり、Javaが割り当てたヒープを意味します。そのため、-Xms90gがあり、アプリが非常に軽量である場合でも、90gを超えるメモリが割り当てられます。 。以下の「unknown(yahoo)」を削除して回答を確認してください(一見すると異なる場合があります)
0fnt

好奇心旺盛ですが、これらは推定値にすぎないのですか?
ComputerScientist

@ComputerScientist freeは実際には無料(GC後)であるため、GCを待機しているオブジェクトは表示されません。より正確にするには、この回答の前に2つのガベージコレクションを実行します。GCを使用した場合と使用しない場合で試してみると、GC後の値は非常に一貫していますが、GC後の値は通常、少なくとも2倍になります。
ビルK

@sbeliakov JavaSysmon(github.com/jezhumble/javasysmon)を使用できますが、新しい質問を開くことをお勧めします。GitHubのライブラリにはバグがあり、32ビットを64ビットとして認識しますが、異なるjarの混在に関する作業を見つけました[ github.com/goxr3plus/XR3Player/blob/master/resources/libs/… ]。
GOXR3PLUS 2017年

20
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();
    }
}

トピックが始まったという私の理解は、OSで利用可能なメモリの量について尋ねることでした。freeMemoryここでは、非常に異なるJVMで使用可能なメモリ量を返します
Tagar

クラスSystemInfoがCapitalで始まっておらず、メソッドInfo()、OSname()、MemInfo()がそうであるのは奇妙ではありませんか?
Drswaki69

18

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つを引いたものです。マイナーコレクションには約1/4秒かかりました。

0.2300771 secs (in the first line)

詳細については、http//java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.htmlを参照してください。


17

ここから

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

1
そして記憶について?
Daniel

2
List <MemoryPoolMXBean> memoryPools = new ArrayList <MemoryPoolMXBean>(ManagementFactory.getMemoryPoolMXBeans()); long usedHeapMemoryAfterLastGC = 0; for(MemoryPoolMXBean memoryPool:memoryPools){if(memoryPool.getType()。equals(MemoryType.HEAP)){MemoryUsage poolCollectionMemoryUsage = memoryPool.getCollectionUsage(); usedHeapMemoryAfterLastGC + = poolCollectionMemoryUsage.getUsed(); }}
danieln

1
CPU使用率の取得を示す唯一の回答をありがとうございます。
Matthieu、2015年

1
これを行うことと単に行うことの違いは何operatingSystemMXBean.getProcessCpuLoad();ですか?Oracleのドキュメントによると、このメソッドは「Java仮想マシンプロセスの「最近のCPU使用量」を返します。」しかし、私はあなたの方法とこの方法の間に比較的大きな数の違いを見ます。
Ishnark 2017

1
@RobHall 2つのOperatingSystemMXBeanクラスがあります。1つは、で提供されるインターフェイスjava.langです。しかし、これをで拡張した別のバージョンもありcom.sun.managementます。それはそれからである私が言及していた方法だOperatingSystemMXBean
Ishnark

9

JMX、提供されるMXBean(ThreadMXBeanなど)は、メモリとCPUの使用状況を提供します。

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

8

メモリ使用量については、以下が機能します、

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

CPU使用率については、外部アプリケーションを使用して測定する必要があります。


5

:Javaの1.5以降JDKは、新しいツールが付属してJConsoleのあなたに1.5以降のJVMのCPUとメモリの使用状況を表示することができますウィッヒ。これらのパラメーターのチャートを作成し、CSVにエクスポートし、ロードされたクラスの数、インスタンスの数、デッドロック、スレッドなどを表示できます。


4

ここで多くの回答に掲載されているruntime / totalMemoryソリューションを使用している場合(私は多くのことを行いました)、かなり正確で一貫した結果が必要な場合は、最初に2つのガベージコレクションを強制するようにしてください。

効率を上げるために、Javaは通常、GCを強制する前にガベージがすべてのメモリを埋めることを許可し、それでも通常は完全なGCではないため、runtime.freeMemory()の結果は常に「実際の」空きメモリ量と0の間のどこかにあります。 。

最初のGCはすべてを取得するのではなく、ほとんどを取得します。

上昇傾向は、freeMemory()呼び出しを実行するだけでは絶対に役に立たず、大きく変動する数値を取得することですが、2 gcを最初に実行する場合、それは非常に信頼できるゲージです。また、ルーチンがかなり遅くなります(おそらく数秒)。


3

Javaのランタイムオブジェクトは、JVMのメモリ使用量を報告できます。CPUを消費するには、UnixのトップやWindowsプロセスマネージャーなどの外部ユーティリティを使用する必要があります。


2

現在のメモリ使用量をメガバイト単位で計算する簡単なコードを次に示します。

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

2

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();
}

あなたはここでもっと読むことができます


1

JConsoleは、実行中のJavaアプリケーションを監視する簡単な方法です。または、プロファイラーを使用して、アプリケーションの詳細情報を取得できます。これにはNetBeans Profilerを使用するのが好きです。




0

Eclipseの場合は、TPTP(Test and Performance Tools Platform)を使用してメモリ使用量などを分析できます。詳細

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.