it-swarm-tr.com

Java'da CPU ve Bellek Kullanımı'nı nasıl kontrol edebilirim?

Java için sunucu için CPU ve bellek kullanımını kontrol etmem gerekiyor, nasıl yapılacağını bilen var mı?

93
Johnny Bou

JVM'de özellikle hafıza arıyorsanız:

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

Ancak, bunlar sadece bir tahmin olarak alınmalıdır ...

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

Sun JVM kullanıyorsanız ve uygulamanın dahili hafıza kullanımıyla ilgileniyorsanız (uygulamanızın kullandığı ayrılmış hafızadan ne kadarı varsa) JVM'lerin dahili çöp toplama günlüğünü açmayı tercih ederim. Basitçe -verbose: gc'i başlangıç ​​komutuna ekleyin.

Sun belgesinden:

-Verbose: gc komut satırı argümanı her koleksiyonda bilgi basar. -Verbose: gc çıkışının formatının J2SE platformunun sürümleri arasında değişebileceğini unutmayın. Örneğin, işte büyük bir sunucu uygulamasından çıktı:

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

Burada iki küçük koleksiyon ve bir büyük koleksiyon görüyoruz. Oktan önceki ve sonraki sayılar

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

sırasıyla, çöp toplama işleminden önce ve sonra canlı nesnelerin boyutlarını gösterir. Küçük koleksiyonlardan sonra, sayı, mutlaka canlı olmayan, ancak doğrudan hayatta oldukları ya da tenured neslinin içinde bulundukları ya da başvuruda bulundukları için geri alınamayan nesneleri içerir. Parantez içindeki sayı

(776768K) (in the first line)

kalıcı kuşaktaki boşluğu saymayan toplam kullanılabilir alandır; bu, kalan eksi alanlardan biri olan toplam eksidir. Küçük koleksiyon, saniyenin dörtte birini aldı.

0.2300771 secs (in the first line)

Daha fazla bilgi için bakınız: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

burada

    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, sağlanan MXBeans (ThreadMXBean, vb.) Size Bellek ve CPU kullanımlarını sağlayacaktır.

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

Hafıza kullanımı için aşağıdakiler

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

CPU kullanımı için, ölçmek üzere harici bir uygulama kullanmanız gerekir.

8
Rich Adams

Java 1.5'ten bu yana JDK yeni bir araçla birlikte gelir: JConsole , size herhangi bir 1.5 veya daha sonraki JVM'nin CPU ve bellek kullanımını gösterebilir. Bu parametrelerin çizelgelerini yapabilir, CSV'ye dışa aktarabilir, yüklenen sınıfların sayısını, örneklerin sayısını, kilitlenmeyi, iş parçacığını vs. gösterebilir ...

5
Telcontar

Burada birçok cevaba gönderilen çalışma zamanı/totalMemory çözümünü kullanıyorsanız (bunu çok yaptım), oldukça doğru/tutarlı sonuçlar almak istiyorsanız önce iki çöp koleksiyonunu zorladığınızdan emin olun.

_ Verimliliği için Java genellikle çöplerin bir GC'yi zorlamadan önce tüm belleği doldurmasına izin verir ve hatta o zaman genellikle tam bir GC değildir, bu nedenle runtime.freeMemory () sonuçları her zaman "gerçek" arasındadır. boş hafıza miktarı ve 0.

İlk GC her şeyi alamaz, çoğunu alır.

Yükseliş şu ki, freeMemory () çağrısını sadece yaparsanız, kesinlikle işe yaramaz ve çok çeşitli bir sayı elde edersiniz, ancak ilk 2 gc yaparsanız, bu çok güvenilir bir ölçüdür. Ayrıca, MUCH rutinini yavaşlatır (saniyeler, muhtemelen).

4
Bill K

Java'nın Runtime nesnesi JVM'nin bellek kullanımını bildirebilir. CPU tüketimi için, Unix'in üstü veya Windows İşlem Yöneticisi gibi harici bir yardımcı program kullanmanız gerekir.

3
moonshadow

Geçerli bellek kullanımını megabayt olarak hesaplamak için bazı basit kod:

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

CPU Yükünü izlemek için aşağıdaki yolu da eklerdim:

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

Daha fazla okuyabilirsiniz burada

2
sbeliakov

JConsole çalışan bir Java uygulamasını izlemek için kolay bir yoldur veya uygulamanız hakkında daha ayrıntılı bilgi almak için bir Profiler kullanabilirsiniz. Bunun için NetBeans Profiler 'i kullanmayı seviyorum.

1
blahspam

YourKit Java profiler mükemmel bir ticari çözümdür. Daha fazla bilgiyi CPU profiling ve bellek profilleme adresinde bulabilirsiniz.

1
Gregg

Tomcat kullanıyorsanız, dahili ve harici bellek tüketiminin yanı sıra diğer alanların bir Ana Sistemini izlemenizi sağlayan Psi Probe işaretini kontrol edin.

1
Tim Howland

Eclipse için, bellek kullanımını vb. Analiz etmek için TPTP'yi (Test ve Performans Araçları Platformu) kullanabilirsiniz. daha fazla bilgi

0
Fuangwith S.