2017-11-29 1 views
-1

벽시계 시간을 사용하는 작업 타이밍은 이 아니며은이 post입니다.JVM에서 실행중인 Java 프로그램 (단일 또는 다중 스레드)의 CPU 시간을 얻는 방법?

"벽 시계 시간"은 작업 완료를 기다리는 사용자가 경험 한 실제 경과 시간입니다. Java 1.5 이전에는 벽 시계 시간을 측정하는 것이 Java 작업을 벤치마킹하는 데 사용 된 일반적인 방법이었습니다.

벽시계 시간을 측정하려면 작업 전후에 java.lang.System . currentTimeMillis()으로 전화하여 차이를 확인하십시오. 이 메서드는 밀리 초 (1/1000 초)로 시간을 반환합니다.

벽시계 시간은 백그라운드 프로세스, 다른 응용 프로그램, 디스크 또는 네트워크 활동 및 디스플레이 업데이트와 같은 시스템상의 다른 활동에 크게 영향을받습니다. Windows와 같은 일부 시스템에서는 응용 프로그램이 맨 위에 있지 않으면 더 낮은 우선 순위로 실행되고 오래 걸립니다. 이 모든 것은 많은 테스트에서 언로드 된 시스템과 평균을 사용하지 않는 한 벤치 마크 결과를 왜곡 할 수 있습니다.

사용자가 경험할 내용에 관심이있는 경우 벽 시계 시간을 사용하는 것이 반드시 나쁜 것은 아닙니다. 그러나 그것은 자신의 응용 프로그램의 문제점을 드러내는 일관된 벤치 마크 번호를 얻는 것을 어렵게 만듭니다.

getProcessCpuTime()을 사용하면 JVM의 모든 시간을 측정 한 것으로 보입니다.

그래서 실제 Java 프로그램 스레드 CPU 시간을 측정 할 수 있도록 JVM 내장 스레드 (below)와 Java 프로그램 스레드 (단일 또는 다중 스레드)를 구별하는 방법은 무엇입니까? 이 post에서

enum ThreadType { // **intrinsic threads** 
    vm_thread, 
    cgc_thread,  // Concurrent GC thread 
    pgc_thread,  // Parallel GC thread 
    java_thread,  // Java, CodeCacheSweeper, JVMTIAgent and Service threads. 
    compiler_thread, 
    watcher_thread, 
    os_thread 
    }; 

main_thread는 단일 스레드 것 같다. JVM에서 뮤 테이터 스레드를 만들었습니까? (src/share/vm/runtime/thread.cpp)

자바 프로그램이 다중 스레드 무엇 경우
3191 // Attach the main thread to this os thread 
3192 JavaThread* main_thread = new JavaThread(); 
3193 main_thread->set_thread_state(_thread_in_vm); 
3194 // must do this before set_active_handles and initialize_thread_local_storage 
3195 // Note: on solaris initialize_thread_local_storage() will (indirectly) 
3196 // change the stack size recorded here to one based on the java thread 
3197 // stacksize. This adjusted size is what is used to figure the placement 
3198 // of the guard pages. 
3199 main_thread->record_stack_base_and_size(); 
3200 main_thread->initialize_thread_local_storage(); 

, 아래의 프로그램 같은?

// Java code for thread creation by implementing 
// the Runnable Interface 
class MultithreadingDemo implements Runnable 
{ 
    public void run() 
    { 
     try 
     { 
      // Displaying the thread that is running 
      System.out.println ("Thread " + 
        Thread.currentThread().getId() + 
        " is running"); 

     } 
     catch (Exception e) 
     { 
      // Throwing an exception 
      System.out.println ("Exception is caught"); 
     } 
    } 
} 
int n = 8; // Number of threads 
for (int i=0; i<8; i++) 
{ 
    Thread object = new Thread(new MultithreadingDemo()); 
    object.start(); 
}  

MXBeans가 메인 스레드 1 개만 반환하는 이유는 무엇입니까? MXBean에는 1 개 주 스레드를 반환하는 이유

import java.lang.management.ManagementFactory; 
import java.lang.management.ThreadInfo; 
import java.lang.management.ThreadMXBean; 
import java.util.ArrayDeque; 
import java.util.LinkedList; 

public class MultiThread { 
    /** Get CPU time in nanoseconds. */ 
    public long getCpuTime() { 
     ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
     return bean.isCurrentThreadCpuTimeSupported() ? 
       bean.getCurrentThreadCpuTime() : 0L; 
    } 
    /** Get user time in nanoseconds. */ 
    public long getUserTime() { 
     ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
     return bean.isCurrentThreadCpuTimeSupported() ? 
       bean.getCurrentThreadUserTime() : 0L; 
    } 

    public static void main(String[] args) { 

     // deque operation 
     //ArrayDeque<LinkedList<Integer>> deque = new ArrayDeque<LinkedList<Integer>>(); 
     ArrayDeque<Byte[]> deque = new ArrayDeque<Byte[]>(); 
     int objectSize = 1024; 
     int xxx = 0; 

     // expand old and young heap size 
     for(long i = 0; i < 1500; i++){ 
      for(int j = 0; j < 300; j++){ 
       deque.addLast(new Byte[objectSize]); 
      } 
      for(int m = 0; m < 65535; m++){ 
       xxx += 1; 
       xxx -= 1; 
      } 
      for(int j = 0; j < 20; j++){ 
       deque.removeLast(); 
      } 
     } 

     for(long i = 0; i < 1500; i++){ 
      for(int j = 0; j < 300; j++){ 
       deque.addLast(new Byte[objectSize]); 
      } 
      for(int m = 0; m < 65535; m++){ 
       xxx += 1; 
       xxx -= 1; 
      } 
      for(int j = 0; j < 300; j++){ 
       deque.removeFirst(); 
      } 
     } 

     int n = 8; // Number of threads 
     for (int i=0; i<8; i++) 
     { 
      Thread object = new Thread(new MultithreadingDemo()); 
      object.start(); 
     } 

     ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 
     //don't need monitor and synchronizer info,only get thread and stack info。 
     ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); 
     for (ThreadInfo threadInfo : threadInfos) { 
      String tName = threadInfo.getThreadName(); 
      long tId = threadInfo.getThreadId(); 
      System.out.println(tName + "," + tId); 
     } 
    } 
} 
+0

[Java 성능 테스트] (https://stackoverflow.com/questions/447739/java-performance-testing)의 가능한 복제본 – the8472

답변

0

?

당신은 당신이 getCurrentThreadCpuTime를 호출 할 때 현재의 thread를 호출하기위한 CPU 사이클을 측정하는 ThreadMXBean을 사용하고 있기 때문에. 그것은 주석에서 말하는 것과 정확히 동일합니다. 예를 들어 다른 스레드를 제외하고 측정하도록 선택한 특정 스레드에 CPU 시간이 얼마나 소요되었는지를 측정하려는 경우 매우 유용합니다. 귀하가 요청한 세부 사항을 제공합니다.질문을하는 경우에도 컴파일되지 않습니다

MultiThread

, 당신은 적어도 일부 실제 코드를 게시하기위한 노력을해야한다.

관련 문제