歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 工具(jmap,jstack)在Linux上的源碼分析(三)執行的線程vm thread

Java 工具(jmap,jstack)在Linux上的源碼分析(三)執行的線程vm thread

日期:2017/3/1 10:40:26   编辑:Linux編程

在前面的文章中(http://www.linuxidc.com/Linux/2012-01/51213.htm)所提到的信號轉發線程,Attach Listener 線程都只是操作socket文件,並沒有去執行比如stack 分析,或者heap的分析,真正的工作線程其實是vm thread.

(一)啟動vm thread

  1. jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
  2. ...
  3. // Create the VMThread
  4. { TraceTime timer("Start VMThread", TraceStartupTime);
  5. VMThread::create();
  6. Thread* vmthread = VMThread::vm_thread();
  7. if (!os::create_thread(vmthread, os::vm_thread))
  8. vm_exit_during_initialization("Cannot create VM thread. Out of system resources.");
  9. // Wait for the VM thread to become ready, and VMThread::run to initialize
  10. // Monitors can have spurious returns, must always check another state flag
  11. {
  12. MutexLocker ml(Notify_lock);
  13. os::start_thread(vmthread);
  14. while (vmthread->active_handles() == NULL) {
  15. Notify_lock->wait();
  16. }
  17. }
  18. }
  19. ...
  20. }

我們可以看到,在thread.cpp裡啟動了線程vm thread,在這裡我們同時也稍微的略帶的講一下jvm在linux裡如何啟動線程的。

通常在linux中啟動線程,是調用

  1. int pthread_create((pthread_t *__thread, __const pthread_attr_t *__attr,void *(*__start_routine) (void *), void *__arg));

而在java裡卻增加了os:create_thread --初始化線程 和os:start_thread--啟動線程

我們去看一下jvm裡面是如何在linux裡做到的

在os_linux.cpp中來看create_thread的方法

  1. bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
  2. ....
  3. int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
  4. ....
  5. }

繼續看java_start方法

  1. static void *java_start(Thread *thread) {
  2. ....
  3. // handshaking with parent thread
  4. {
  5. MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
  6. // notify parent thread
  7. osthread->set_state(INITIALIZED);
  8. sync->notify_all();
  9. // wait until os::start_thread()
  10. while (osthread->get_state() == INITIALIZED) {
  11. sync->wait(Mutex::_no_safepoint_check_flag);
  12. }
  13. }
  14. // call one more level start routine
  15. thread->run();
  16. return 0;
  17. }

首先jvm先設置了當前線程的狀態是Initialized, 然後notify所有的線程,

while (osthread->get_state() == INITIALIZED) {
sync->wait(Mutex::_no_safepoint_check_flag);
}

不停的查看線程的當前狀態是不是Initialized, 如果是的話,調用了sync->wait()的方法等待。

來看os:start_thread的方法 os.cpp

  1. void os::start_thread(Thread* thread) {
  2. // guard suspend/resume
  3. MutexLockerEx ml(thread->SR_lock(), Mutex::_no_safepoint_check_flag);
  4. OSThread* osthread = thread->osthread();
  5. osthread->set_state(RUNNABLE);
  6. pd_start_thread(thread);
  7. }
Copyright © Linux教程網 All Rights Reserved