2009-04-16 31 views

Trả lời

1

Mặc dù điều này phụ thuộc vào nền tảng, tôi tin rằng những gì bạn đang tìm kiếm là ThreadMXBean: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html. Bạn có thể sử dụng phương thức getThreadUserTime, ví dụ, để có được những gì bạn cần. Để kiểm tra xem nền tảng của bạn có hỗ trợ đo CPU hay không, bạn có thể gọi isThreadCpuTimeSupported().

17

Tôi tin rằng JConsole (archived link) không cung cấp loại thông tin này thông qua một plugin

JConsole Thread CPU usage, after blogs.oracle.com/lmalventosa/resource/thread_cpu_usage.jpg

Nó sử dụng ThreadMXBean getThreadCpuTime() chức năng.

Something dọc theo dòng:

 long upTime = runtimeProxy.getUptime(); 
     List<Long> threadCpuTime = new ArrayList<Long>(); 
     for (int i = 0; i < threadIds.size(); i++) { 
      long threadId = threadIds.get(i); 
      if (threadId != -1) { 
       threadCpuTime.add(threadProxy.getThreadCpuTime(threadId)); 
      } else { 
       threadCpuTime.add(0L); 
      } 
     } 
     int nCPUs = osProxy.getAvailableProcessors(); 
     List<Float> cpuUsageList = new ArrayList<Float>(); 
     if (prevUpTime > 0L && upTime > prevUpTime) { 
      // elapsedTime is in ms 
      long elapsedTime = upTime - prevUpTime; 
      for (int i = 0; i < threadIds.size(); i++) { 
       // elapsedCpu is in ns 
       long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i); 
       // cpuUsage could go higher than 100% because elapsedTime 
       // and elapsedCpu are not fetched simultaneously. Limit to 
       // 99% to avoid Chart showing a scale from 0% to 200%. 
       float cpuUsage = Math.min(99F, elapsedCpu/(elapsedTime * 1000000F * nCPUs)); 
       cpuUsageList.add(cpuUsage); 
      } 
     } 
+1

Chỉ cần lưu ý, bạn cũng có thể muốn kiểm tra xem CpuTime có được bật trong JVM mà bạn đang chạy hay không. 'threadBean_.isThreadCpuTimeEnabled()' sẽ trả về giá trị boolean và bạn luôn có thể đặt nó nếu nó không có 'threadBean_.setThreadCpuTimeEnabled (true)' – Graham

11

bằng cách sử dụng java.lang.management.ThreadMXBean. Làm thế nào để có được một ThreadMXBean:

ThreadMXBean tmxb = ManagementFactory.getThreadMXBean(); 

sau đó bạn có thể truy vấn bao nhiêu a thread cụ thể được tiêu thụ bằng cách sử dụng:

long cpuTime = tmxb.getThreadCpuTime(aThreadID); 

Hy vọng nó giúp.

1

Thực tế đối tượng ThreadMXBean cung cấp chức năng bạn cần (tuy nhiên nó có thể không được thực hiện trên tất cả các máy ảo).

Trong JDK 1.5 có một chương trình demo thực hiện chính xác những gì bạn cần. Đó là trong thư mục demo/quản lý và nó được gọi là JTop.java

Thật không may, nó không có trong Java6. Có lẽ bạn có thể tìm thấy tại với google hoặc tải về JDK5.

3

Option_1: Trình độ Mã

Trong mã logic kinh doanh của bạn; trong API bắt đầu cuộc gọi start() và trong chặn cuộc gọi chặn cuối cùng(). Vì vậy, bạn sẽ nhận được thời gian CPU để thực thi logic của bạn theo luồng đang chạy. Sau đó đăng nhập. Reference.

class CPUTimer 
{ 
    private long _startTime = 0l; 

    public void start() 
    { 
     _startTime = getCpuTimeInMillis(); 
    } 


    public long stop() 
    { 
     long result = (getCpuTimeInMillis() - _startTime); 
     _startTime = 0l; 
     return result; 
    } 

    public boolean isRunning() 
    { 
     return _startTime != 0l; 
    } 

    /** thread CPU time in milliseconds. */ 
    private long getCpuTimeInMillis() 
    { 
     ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
     return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L; 
    } 
} 

Option_2: Trình độ Màn hình sử dụng plugin (AIX của IBM hộp mà không có hỗ trợ jvisualvm)

Nếu bạn nghĩ rằng đó là sự chậm trễ trong cách thêm mã bây giờ, sau đó bạn có thể thích JConsole với hỗ trợ plugin. Tôi đã theo dõi this bài viết. Tải topthreads jar từ bài viết đó và chạy ./jconsole -pluginpath topthreads-1.1.jar

Option_3: Màn trình độ sử dụng TOP (shift H) + jstack (máy Unix trong đó có hỗ trợ 'shif + H')

Thực hiện theo this hướng dẫn, nơi lệnh trên cùng sẽ cung cấp tùy chọn để tìm chuỗi CPU trên cùng (nid).Hãy kiểm tra rằng nid trong tập tin đầu ra jstack.

Các vấn đề liên quan