it-swarm-vi.tech

Làm cách nào để kiểm tra CPU và sử dụng bộ nhớ trong Java?

Tôi cần kiểm tra việc sử dụng CPU và bộ nhớ cho máy chủ trong Java, có ai biết làm thế nào để thực hiện được không?

93
Johnny Bou

Nếu bạn đang tìm kiếm bộ nhớ cụ thể trong 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/>");

Tuy nhiên, những điều này chỉ nên được coi là một ước tính ...

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

Nếu bạn đang sử dụng Sun JVM và quan tâm đến việc sử dụng bộ nhớ trong của ứng dụng (bao nhiêu bộ nhớ được phân bổ mà ứng dụng của bạn đang sử dụng), tôi thích bật ghi nhật ký bộ sưu tập rác tích hợp của JVM. Bạn chỉ cần thêm -verbose: gc vào lệnh khởi động.

Từ tài liệu của Sun:

Đối số dòng lệnh -verbose: gc in thông tin ở mọi bộ sưu tập. Lưu ý rằng định dạng của đầu ra -verbose: gc có thể thay đổi giữa các bản phát hành của nền tảng J2SE. Ví dụ, đây là đầu ra từ một ứng dụng máy chủ lớn:

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

Ở đây chúng tôi thấy hai bộ sưu tập nhỏ và một bộ chính. Các số trước và sau mũi tên

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

chỉ ra kích thước kết hợp của các đối tượng sống trước và sau khi thu gom rác, tương ứng. Sau các bộ sưu tập nhỏ, số lượng bao gồm các đối tượng không nhất thiết phải sống nhưng không thể được thu hồi, vì chúng trực tiếp còn sống hoặc do chúng nằm trong hoặc được tham chiếu từ thế hệ được thuê. Số trong ngoặc đơn

(776768K) (in the first line)

là tổng không gian có sẵn, không kể không gian trong thế hệ cố định, là tổng số heap trừ đi một trong những không gian sống sót. Bộ sưu tập nhỏ mất khoảng một phần tư giây.

0.2300771 secs (in the first line)

Để biết thêm thông tin, hãy xem: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

Từ tại đây

    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, v.v.) được cung cấp sẽ cung cấp cho bạn công dụng Bộ nhớ và CPU.

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

Để sử dụng bộ nhớ, sau đây sẽ hoạt động,

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

Để sử dụng CPU, bạn sẽ cần sử dụng một ứng dụng bên ngoài để đo lường nó.

8
Rich Adams

Vì Java 1.5, JDK đi kèm với một công cụ mới: JConsole wich có thể cho bạn thấy mức độ sử dụng CPU và bộ nhớ của bất kỳ JVM 1.5 trở lên. Nó có thể thực hiện các biểu đồ của các tham số này, xuất sang CSV, hiển thị số lượng lớp được tải, số lượng phiên bản, khóa chết, luồng, v.v.

5
Telcontar

Nếu bạn sử dụng giải pháp runtime/totMemory đã được đăng trong nhiều câu trả lời ở đây (tôi đã làm điều đó rất nhiều), hãy chắc chắn buộc hai bộ sưu tập rác trước nếu bạn muốn kết quả khá chính xác/nhất quán.

Đối với hiệu quả Java thường cho phép rác lấp đầy tất cả bộ nhớ trước khi buộc một GC và thậm chí sau đó thường không phải là một GC hoàn chỉnh, do đó, kết quả của bạn cho runtime.freeMemory () luôn nằm ở giữa lượng "thực" bộ nhớ trống và 0.

GC đầu tiên không có được mọi thứ, nó nhận được hầu hết.

Điều đáng mừng là nếu bạn chỉ thực hiện cuộc gọi freeMemory (), bạn sẽ nhận được một số hoàn toàn vô dụng và rất khác nhau, nhưng nếu làm 2 gc trước thì đó là một thước đo rất đáng tin cậy. Nó cũng làm cho thói quen NHIỀU chậm hơn (giây, có thể).

4
Bill K

Đối tượng của Java Runtime có thể báo cáo việc sử dụng bộ nhớ của JVM. Để tiêu thụ CPU, bạn sẽ phải sử dụng một tiện ích bên ngoài, như Trình quản lý quy trình hàng đầu của Unix hoặc Windows.

3
moonshadow

Đây là một số mã đơn giản để tính toán mức sử dụng bộ nhớ hiện tại tính bằng megabyte:

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

Tôi cũng sẽ thêm cách sau để theo dõi tải 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();
}

Bạn có thể đọc thêm tại đây

2
sbeliakov

JConsole là một cách dễ dàng để giám sát một ứng dụng Java đang chạy hoặc bạn có thể sử dụng Profiler để nhận thông tin chi tiết hơn về ứng dụng của mình. Tôi thích sử dụng NetBeans Profiler cho việc này.

1
blahspam

YourKit Java profiler là một giải pháp thương mại tuyệt vời. Bạn có thể tìm thêm thông tin trong các tài liệu trên cấu hình CPcấu hình bộ nhớ .

1
Gregg

Nếu bạn đang sử dụng Tomcat, hãy xem Psi thăm dò , cho phép bạn theo dõi mức tiêu thụ bộ nhớ trong và ngoài cũng như Máy chủ của các khu vực khác.

1
Tim Howland

Đối với Eclipse, bạn có thể sử dụng TPTP (Nền tảng công cụ kiểm tra và hiệu suất) để phân tích việc sử dụng bộ nhớ và vv thêm thông tin

0
Fuangwith S.