벽시계 시간을 사용하는 작업 타이밍은 이 아니며은이 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);
}
}
}
[Java 성능 테스트] (https://stackoverflow.com/questions/447739/java-performance-testing)의 가능한 복제본 – the8472