it-swarm-id.com

Bagaimana cara memeriksa CPU dan Penggunaan Memori di Java?

Saya perlu memeriksa penggunaan CPU dan memori untuk server di Jawa, ada yang tahu bagaimana hal itu bisa dilakukan?

93
Johnny Bou

Jika Anda mencari memori secara khusus di 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/>");

Namun, ini harus diambil hanya sebagai perkiraan ...

69
Jeremy
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();
    }
}
19
Dave

Jika Anda menggunakan Sun JVM, dan tertarik pada penggunaan memori internal aplikasi (berapa banyak dari memori yang dialokasikan aplikasi Anda gunakan) Saya lebih suka untuk mengaktifkan logging pengumpulan sampah bawaan JVM. Anda cukup menambahkan -verbose: gc ke perintah startup.

Dari dokumentasi Sun:

Argumen baris perintah -verbose: gc mencetak informasi di setiap koleksi. Perhatikan bahwa format keluaran -verbose: gc dapat berubah di antara rilis platform J2SE. Sebagai contoh, berikut adalah output dari aplikasi server besar:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Di sini kita melihat dua koleksi kecil dan satu koleksi besar. Angka-angka sebelum dan sesudah panah

325407K->83000K (in the first line)

masing-masing menunjukkan ukuran gabungan objek hidup sebelum dan sesudah pengumpulan sampah. Setelah koleksi kecil perhitungan termasuk objek yang tidak selalu hidup tetapi tidak dapat direklamasi, baik karena mereka langsung hidup, atau karena mereka berada di dalam atau direferensikan dari generasi bertenor. Angka dalam kurung

(776768K) (in the first line)

adalah total ruang yang tersedia, tidak termasuk ruang dalam generasi permanen, yang merupakan tumpukan total dikurangi salah satu ruang yang selamat. Koleksi minor ini membutuhkan waktu sekitar seperempat detik.

0.2300771 secs (in the first line)

Untuk info lebih lanjut, lihat: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

Dari di sini

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

JMX, MXBeans (ThreadMXBean, dll) yang disediakan akan memberi Anda penggunaan Memori dan CPU.

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

Untuk penggunaan memori, berikut ini akan berfungsi,

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

Untuk penggunaan CPU, Anda harus menggunakan aplikasi eksternal untuk mengukurnya.

8
Rich Adams

Sejak Java 1,5 JDK dilengkapi dengan alat baru: JConsole yang dapat menunjukkan kepada Anda penggunaan CPU dan memori dari setiap 1,5 atau lebih baru JVM. Itu bisa melakukan bagan dari parameter-parameter ini, mengekspor ke CSV, menunjukkan jumlah kelas yang dimuat, jumlah instance, deadlock, utas dll ...

5
Telcontar

Jika Anda menggunakan solusi runtime/totalMemory yang telah diposting di banyak jawaban di sini (saya sudah sering melakukannya), pastikan untuk memaksa dua koleksi sampah terlebih dahulu jika Anda ingin hasil yang cukup akurat/konsisten.

Untuk efisiensi Java biasanya memungkinkan sampah untuk mengisi semua memori sebelum memaksakan GC, dan bahkan itu pun biasanya bukan GC lengkap, jadi hasil Anda untuk runtime.freeMemory () selalu berada di antara "nyata" jumlah memori bebas dan 0.

GC pertama tidak mendapatkan segalanya, mendapatkan sebagian besar.

Kenaikannya adalah bahwa jika Anda hanya melakukan panggilan freeMemory () Anda akan mendapatkan nomor yang sama sekali tidak berguna dan sangat bervariasi, tetapi jika melakukan 2 gc pertama itu adalah pengukur yang sangat dapat diandalkan. Ini juga membuat JAUH rutin lebih lambat (detik, mungkin).

4
Bill K

Objek Java Runtime dapat melaporkan penggunaan memori JVM. Untuk konsumsi CPU Anda harus menggunakan utilitas eksternal, seperti Unix's top atau Windows Process Manager.

3
moonshadow

Berikut adalah beberapa kode sederhana untuk menghitung penggunaan memori saat ini dalam megabita:

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

Saya juga akan menambahkan cara berikut untuk melacak Beban 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();
}

Anda dapat membaca lebih lanjut di sini

2
sbeliakov

JConsole adalah cara mudah untuk memonitor aplikasi Java yang sedang berjalan atau Anda dapat menggunakan Profiler untuk mendapatkan informasi lebih rinci tentang aplikasi Anda. Saya suka menggunakan NetBeans Profiler untuk ini.

1
blahspam

Profiler YourKit Javaadalah solusi komersial yang sangat baik. Anda dapat menemukan informasi lebih lanjut dalam dokumen di profil CP dan profil memori .

1
Gregg

Jika Anda menggunakan Tomcat, periksa Probe Psi , yang memungkinkan Anda memantau konsumsi memori internal dan eksternal serta Host area lainnya.

1
Tim Howland

Untuk Eclipse, Anda dapat menggunakan TPTP (Platform Test and Performance Tools) untuk menganalisis penggunaan memori dan lain-lain informasi lebih lanjut

0
Fuangwith S.