精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java開源工具在linux上的源碼分析(二):信號處理

開發 后端
當java虛擬機啟動的時候,會啟動很多內部的線程,這些線程主要在thread.cpp里的create_vm方法體里實現。而在thread.cpp里主要起了2個線程來處理信號相關的。詳細請看下文

當java虛擬機啟動的時候,會啟動很多內部的線程,這些線程主要在thread.cpp里的create_vm方法體里實現。

而在thread.cpp里主要起了2個線程來處理信號相關的:

  1. JvmtiExport::enter_live_phase();  
  2.  
  3. // Signal Dispatcher needs to be started before VMInit event is posted  
  4. os::signal_init();  
  5.  
  6. // Start Attach Listener if +StartAttachListener or it can't be started lazily  
  7. if (!DisableAttachMechanism) {  
  8.   if (StartAttachListener || AttachListener::init_at_startup()) {  
  9.     AttachListener::init();  
  10.   }  

1. Signal Dispatcher 線程

在os.cpp中的signal_init()函數中,啟動了signal dispatcher 線程,對signal dispather 線程主要是用于處理信號,等待信號并且分發處理,可以詳細看signal_thread_entry的方法:

  1. static void signal_thread_entry(JavaThread* thread, TRAPS) {  
  2.   os::set_priority(thread, NearMaxPriority);  
  3.   while (true) {  
  4.     int sig;  
  5.     {  
  6.       // FIXME : Currently we have not decieded what should be the status  
  7.       //         for this java thread blocked here. Once we decide about  
  8.       //         that we should fix this.  
  9.       sig = os::signal_wait();  
  10.     }  
  11.     if (sig == os::sigexitnum_pd()) {  
  12.        // Terminate the signal thread  
  13.        return;  
  14.     }  
  15.  
  16.     switch (sig) {  
  17.       case SIGBREAK: {  
  18.         // Check if the signal is a trigger to start the Attach Listener - in that  
  19.         // case don't print stack traces.  
  20.         if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {  
  21.           continue;  
  22.         }  
  23.         // Print stack traces  
  24.         // Any SIGBREAK operations added here should make sure to flush  
  25.         // the output stream (e.g. tty->flush()) after output.  See 4803766.  
  26.         // Each module also prints an extra carriage return after its output.  
  27.         VM_PrintThreads op;  
  28.         VMThread::execute(&op);  
  29.         VM_PrintJNI jni_op;  
  30.         VMThread::execute(&jni_op);  
  31.         VM_FindDeadlocks op1(tty);  
  32.         VMThread::execute(&op1);  
  33.         Universe::print_heap_at_SIGBREAK();  
  34.         if (PrintClassHistogram) {  
  35.           VM_GC_HeapInspection op1(gclog_or_tty, true /* force full GC before heap inspection */,  
  36.                                    true /* need_prologue */);  
  37.           VMThread::execute(&op1);  
  38.         }  
  39.         if (JvmtiExport::should_post_data_dump()) {  
  40.           JvmtiExport::post_data_dump();  
  41.         }  
  42.         break;  
  43.       }  
  44.       default: {  
  45.         // Dispatch the signal to java  
  46.         HandleMark hm(THREAD);  
  47.         klassOop k = SystemDictionary::resolve_or_null(vmSymbolHandles::sun_misc_Signal(), THREAD);  
  48.         KlassHandle klass (THREAD, k);  
  49.         if (klass.not_null()) {  
  50.           JavaValue result(T_VOID);  
  51.           JavaCallArguments args;  
  52.           args.push_int(sig);  
  53.           JavaCalls::call_static(  
  54.             &result,  
  55.             klass,  
  56.             vmSymbolHandles::dispatch_name(),  
  57.             vmSymbolHandles::int_void_signature(),  
  58.             &args,  
  59.             THREAD  
  60.           );  
  61.         }  
  62.         if (HAS_PENDING_EXCEPTION) {  
  63.           // tty is initialized early so we don't expect it to be null, but  
  64.           // if it is we can't risk doing an initialization that might  
  65.           // trigger additional out-of-memory conditions  
  66.           if (tty != NULL) {  
  67.             char klass_name[256];  
  68.             char tmp_sig_name[16];  
  69.             const char* sig_name = "UNKNOWN";  
  70.             instanceKlass::cast(PENDING_EXCEPTION->klass())->  
  71.               name()->as_klass_external_name(klass_name, 256);  
  72.             if (os::exception_name(sig, tmp_sig_name, 16) != NULL)  
  73.               sig_name = tmp_sig_name;  
  74.             warning("Exception %s occurred dispatching signal %s to handler" 
  75.                     "- the VM may need to be forcibly terminated",  
  76.                     klass_name, sig_name );  
  77.           }  
  78.           CLEAR_PENDING_EXCEPTION;  
  79.         }  
  80.       }  
  81.     }  
  82.   }  

可以看到通過os::signal_wait();等待信號,而在linux里是通過sem_wait()來實現,接受到SIGBREAK(linux 中的QUIT)信號的時候(關于信號處理請參考筆者的另一篇博客:java 中關于信號的處理在linux下的實現),***次通過調用 AttachListener::is_init_trigger()初始化attach listener線程,詳細見2.Attach Listener 線程。

***次收到信號,會開始初始化,當初始化成功,將會直接返回,而且不返回任何線程stack的信息(通過socket file的操作返回),并且第二次將不在需要初始化。如果初始化不成功,將直接在控制臺的outputstream中打印線程棧信息。
第二次收到信號,如果已經初始化過,將直接在控制臺中打印線程的棧信息。如果沒有初始化,繼續初始化,走和***次相同的流程。

2. Attach Listener 線程

Attach Listener 線程是負責接收到外部的命令,而對該命令進行執行的并且吧結果返回給發送者。在jvm啟動的時候,如果沒有指定+StartAttachListener,該線程是不會啟動的,剛才我們討論到了在接受到quit信號之后,會調用 AttachListener::is_init_trigger()通過調用用AttachListener::init()啟動了Attach Listener 線程,同時在不同的操作系統下初始化,在linux中 是在attachListener_Linux.cpp文件中實現的。

在linux中如果發現文件.attach_pid#pid存在,才會啟動attach listener線程,同時初始化了socket 文件,也就是通常jmap,jstack tool干的事情,先創立attach_pid#pid文件,然后發quit信號,通過這種方式暗式的啟動了Attach Listener線程(見博客:http://blog.csdn.net/raintungli/article/details/7023092)。

線程的實現在 attach_listener_thread_entry 方法體中實現:

  1. static void attach_listener_thread_entry(JavaThread* thread, TRAPS) {  
  2.   os::set_priority(thread, NearMaxPriority);  
  3.  
  4.   if (AttachListener::pd_init() != 0) {  
  5.     return;  
  6.   }  
  7.   AttachListener::set_initialized();  
  8.  
  9.   for (;;) {  
  10.     AttachOperation* op = AttachListener::dequeue();    
  11.      if (op == NULL) {  
  12.       return;   // dequeue failed or shutdown  
  13.     }  
  14.  
  15.     ResourceMark rm;  
  16.     bufferedStream st;  
  17.     jint res = JNI_OK;  
  18.  
  19.     // handle special detachall operation  
  20.     if (strcmp(op->name(), AttachOperation::detachall_operation_name()) == 0) {  
  21.       AttachListener::detachall();  
  22.     } else {  
  23.       // find the function to dispatch too  
  24.       AttachOperationFunctionInfo* info = NULL;  
  25.       for (int i=0; funcs[i].name != NULL; i++) {  
  26.         const char* name = funcs[i].name;  
  27.         assert(strlen(name) <= AttachOperation::name_length_max, "operation <= name_length_max");  
  28.         if (strcmp(op->name(), name) == 0) {  
  29.           info = &(funcs[i]);  
  30.           break;  
  31.         }  
  32.       }  
  33.  
  34.       // check for platform dependent attach operation  
  35.       if (info == NULL) {  
  36.         info = AttachListener::pd_find_operation(op->name());  
  37.       }  
  38.  
  39.       if (info != NULL) {  
  40.         // dispatch to the function that implements this operation  
  41.         res = (info->func)(op, &st);  
  42.       } else {  
  43.         st.print("Operation %s not recognized!", op->name());  
  44.         res = JNI_ERR;  
  45.       }  
  46.     }  
  47.  
  48.     // operation complete - send result and output to client  
  49.     op->complete(res, &st);  
  50.   }  

在AttachListener::dequeue(); 在liunx里的實現就是監聽剛才創建的socket的文件,如果有請求進來,找到請求對應的操作,調用操作得到結果并把結果寫到這個socket的文件,如果你把socket的文件刪除,jstack/jmap會出現錯誤信息 unable to open socket file:........

 

我們經常使用 kill -3 pid的操作打印出線程棧信息,我們可以看到具體的實現是在Signal Dispatcher 線程中完成的,因為kill -3 pid 并不會創建.attach_pid#pid文件,所以一直初始化不成功,從而線程的棧信息被打印到控制臺中。

原文鏈接:http://blog.csdn.net/raintungli/article/details/7034005

【系列文章】

  1. Java開源工具在linux上的源碼分析(一):跟蹤方式
  2. Java開源工具在linux上的源碼分析(三):執行的線程vm thread
  3. Java開源工具在linux上的源碼分析(四):safe point
  4. Java開源工具在linux上的源碼分析(五):-F參數的bug
  5. Java開源工具在linux上的源碼分析(六):符號表的讀取
責任編輯:林師授 來源: raintungli的博客
相關推薦

2012-03-02 12:14:19

JavaJstackJmap

2012-03-02 12:31:50

Javajmapjstack

2012-03-02 12:25:07

Javajmapjstack

2012-03-02 12:38:49

Javajmapjstack

2012-03-02 13:29:38

Javajmapjstack

2022-06-26 18:09:43

Linux開源

2019-10-16 17:00:51

LinuxUbuntuVMware

2020-05-06 09:51:37

二進制Linux命令行工具

2020-05-09 12:01:40

Linux開源軟件SDN

2010-01-27 09:58:59

Linuxunix程序日志

2024-01-03 10:17:51

Linux通信

2021-03-09 11:25:04

Linux開源工具服務器

2019-08-01 09:52:46

LinuxNetData性能監控工具

2021-09-07 07:53:42

Semaphore 信號量源碼

2012-05-22 00:28:21

JavaJava開源開源工具

2021-09-01 09:47:25

Linux 工具 開發

2021-08-31 09:41:57

LinuxiPhone開源工具

2022-06-06 14:20:25

個人財務開源預算

2025-06-25 06:18:46

Linux多線程機制

2019-05-23 14:36:24

LinuxSOSReportxsos
點贊
收藏

51CTO技術棧公眾號

精品国产一区二区三区久久久樱花| 里番在线播放| 亚州成人在线电影| 精品久久久久久乱码天堂| 日韩黄色在线播放| 欧美日韩在线网站| 日韩美女主播在线视频一区二区三区 | 精品伊人久久久久7777人| 欧美久久精品一级黑人c片 | 国产精品xxx在线观看| 色妞www精品视频| 国产四区在线观看| 男男电影完整版在线观看| 精品中文av资源站在线观看| 97成人在线视频| 黄色精品视频在线观看| 日韩高清电影免费| 欧美一级黄色大片| 成人羞羞国产免费网站| 成人毛片av在线| 久久精品在线观看| 成人区精品一区二区| 99re热视频| 日韩香蕉视频| 欧美精品一区二区三区国产精品| 在线国产视频一区| 成人三级av在线| 欧美精品乱码久久久久久| 日韩久久一级片| 国模私拍视频在线播放| 亚洲三级电影网站| 视频在线精品一区| 免费在线观看一级毛片| 成人免费高清在线观看| 91精品视频免费观看| 中文字幕在线观看视频免费| av成人黄色| 欧美二区在线播放| 在线观看黄网址| 日韩欧美在线中字| 中文字幕免费精品一区| 无码人妻精品一区二区三区温州 | 国产日韩在线一区二区三区| 国产aⅴ爽av久久久久成人| 免费看日韩精品| 国产成人福利网站| 国产美女激情视频| 国产欧美丝祙| 555www成人网| 日本少妇全体裸体洗澡| 一区二区亚洲| 久久久这里只有精品视频| 久草视频在线免费看| 欧美日韩四区| 欧美激情免费在线| 久久免费视频6| 欧美精品一区二区三区久久久竹菊| yw.139尤物在线精品视频| 99久久99久久精品免费看小说.| 国产一区二区三区网| 亚洲性av网站| 中文字幕资源站| 亚洲欧美在线专区| 欧美风情在线观看| 欧美精品亚洲精品日韩精品| 日韩午夜av| 国产999在线| 中文字字幕在线观看| 另类中文字幕网| 91系列在线播放| 亚洲精品一区二区三区四区| 成人激情小说乱人伦| 国产一区精品视频| 精品影院一区| 国产精品国产成人国产三级| 中文字幕一区二区三区在线乱码 | 欧美最顶级丰满的aⅴ艳星| 影音先锋亚洲天堂| 日韩国产在线一| 成人免费视频a| 亚洲乱码精品久久久久..| 成人av中文字幕| 日本a级片久久久| 九七久久人人| 性做久久久久久免费观看| 97国产精东麻豆人妻电影| 亚洲第一会所| 91精品国产综合久久小美女| 在线成人精品视频| 色吊丝一区二区| 日韩中文字幕不卡视频| 久久香蕉精品视频| 日韩精品欧美精品| 亚洲综合在线小说| 日韩在线无毛| 亚洲丝袜美腿综合| 免费黄色福利视频| 国产精品中文| 日韩精品中文字幕久久臀| 特黄一区二区三区| 国产精品亚洲产品| 91精品在线观| 黄色av网站在线免费观看| 亚洲欧美另类在线| 日韩亚洲在线视频| 99a精品视频在线观看| 在线观看日韩专区| jizz国产免费| 精东粉嫩av免费一区二区三区| 国产区一区二区三区| 在线免费观看黄色网址| 亚洲一卡二卡三卡四卡无卡久久| 日韩视频免费在线播放| 99re8这里有精品热视频免费| 国产亚洲精品一区二555| 免费在线视频一区二区| 美女脱光内衣内裤视频久久影院| 久久99影院| 18av在线视频| 欧美日韩国产首页| 欧美图片第一页| 亚洲国产婷婷| 亚洲精品免费一区二区三区| 国产精品无码2021在线观看| 午夜精品久久久久久久久| 伊人五月天婷婷| 色乱码一区二区三区网站| 欧美综合一区第一页| 天堂中文网在线| 一区二区三区在线免费播放| 污污网站在线观看视频| 精品一区二区三| 日韩美女在线观看一区| 五月激情婷婷网| 偷拍与自拍一区| 2018国产精品| 自拍欧美日韩| 91黄在线观看| 在线三级中文| 日韩欧美中文字幕公布| 在线看的片片片免费| 六月丁香婷婷久久| 成年人黄色在线观看| 午夜精品久久久久久毛片| 在线观看国产欧美| 国产午夜无码视频在线观看| 久久亚洲一区二区三区明星换脸| 超碰成人免费在线| 男人的天堂久久| 97**国产露脸精品国产| 亚洲av成人无码久久精品老人 | 国产精品人妖ts系列视频| 中文字幕欧美人妻精品一区| 免费久久久久久久久| 日av在线播放中文不卡| 嫩草精品影院| 欧美优质美女网站| 国产第一页精品| 国产在线精品一区二区夜色| 午夜在线视频免费观看| 亚洲电影一区| 国产91精品不卡视频| 日本中文字幕电影在线观看| 色综合久久88色综合天天6| 最近中文字幕免费| 久久电影国产免费久久电影| 一区二区三区一级片| 欧美专区一区| 91精品国产91久久久| 天堂av在线资源| 在线观看网站黄不卡| 中文字幕美女视频| 成人午夜在线播放| 黄色片久久久久| 日韩久久电影| 国产精品免费区二区三区观看| a'aaa级片在线观看| 亚洲男人第一av网站| 中文字幕精品在线观看| 亚洲精品成人悠悠色影视| 怡红院一区二区| 日本欧美加勒比视频| av中文字幕av| 色爱av综合网| 亚洲最大的av网站| 深夜成人在线| 久久精品中文字幕免费mv| 天天干天天插天天操| 欧美在线观看一二区| 久久国产一级片| 久久久久99精品一区| 欧美xxxxxbbbbb| 久久午夜精品一区二区| 艳母动漫在线观看| 日韩美女毛片| 91亚洲精品久久久| 欧美粗大gay| 欧美二区乱c黑人| 午夜在线观看视频| 337p日本欧洲亚洲大胆精品| 中文字幕人妻一区二区在线视频| 亚洲影院在线观看| 中文字幕黄色网址| 97久久超碰国产精品| 午夜精品免费看| 久久婷婷久久| 国产一区二区视频播放| 91精品电影| 日韩免费中文专区| 欧美一区自拍| 成人精品水蜜桃| 亚洲男男av| 国产精品成人va在线观看| а_天堂中文在线| 超碰97人人做人人爱少妇| av资源在线观看免费高清| 精品国产乱码久久久久久影片| 中文无码精品一区二区三区| 婷婷激情综合网| 久久久综合久久| 亚洲免费三区一区二区| 亚洲精品一区二区三区影院忠贞| 99精品国产一区二区三区不卡| 小早川怜子一区二区三区| 热久久久久久久| 成人观看免费完整观看| 亚洲精品孕妇| 欧美精品卡一卡二| 国产尤物精品| 干日本少妇视频| 日韩av专区| 手机成人在线| 成人精品视频| 日韩欧美一区二区在线观看| 天海翼精品一区二区三区| 国产精品美女久久久久av福利| 一区二区中文字幕在线观看| 91啪国产在线| 国产视频一区二| 成人在线中文字幕| 国产日韩中文在线中文字幕| 91欧美日韩一区| 国产在线一区不卡| 亚洲一区二区三区四区视频| crdy在线观看欧美| 亚洲一区二区少妇| 欧美日韩午夜电影网| 99精品在线直播| 91成人精品在线| 国产视频一区二区三区四区| 欧美调教在线| 欧美一区二区三区精美影视 | 在线观看视频中文字幕| 国产一级视频在线播放| 综合在线观看色| 韩国一级黄色录像| 亚洲日本在线a| 劲爆欧美第一页| 亚洲制服丝袜一区| 亚洲欧美日韩国产成人综合一二三区| 神马影视一区二区| 欧美日韩一区综合| 极品美女一区二区三区| 天堂资源在线亚洲资源| 久久精品不卡| 老司机午夜网站| 亚洲精品少妇| 国产激情在线观看视频| 奇米888四色在线精品| 性chinese极品按摩| 精品系列免费在线观看| 欧美做受高潮中文字幕| 91在线观看地址| 亚洲精品国产精品国自| 亚洲欧美电影一区二区| 久草视频在线免费看| 欧美日韩中文字幕| 中文字字幕在线观看| 欧美一区二区三区播放老司机| 丰满人妻妇伦又伦精品国产| 亚洲精品v天堂中文字幕| 国产高清一区在线观看| 久久精品电影一区二区| 免费看电影在线| 国产91色在线播放| 精品三级国产| 精品免费日产一区一区三区免费| 精品精品99| www.九色.com| 肉丝袜脚交视频一区二区| 人妻换人妻仑乱| 久久久噜噜噜久久中文字幕色伊伊 | av资源吧首页| 欧美艳星brazzers| 亚洲av无码一区二区三区性色| 亚洲男女性事视频| 免费在线看电影| 国产成人精品在线播放| 亚洲精品aⅴ| 视频一区二区在线观看| 在线播放不卡| 91 在线视频观看| 97aⅴ精品视频一二三区| 久久嫩草捆绑紧缚| 色综合色综合色综合| www.色播.com| 一夜七次郎国产精品亚洲| 欧美1234区| 国产精品综合网站| 亚洲另类av| 男人添女荫道口喷水视频| 麻豆精品一区二区综合av| 黄色av网址在线观看| 综合在线观看色| 中文字幕乱码一区二区| 亚洲精品一区中文字幕乱码| 污的网站在线观看| 国产日韩精品入口| 色综合综合网| 男人靠女人免费视频网站| 高清av一区二区| 手机av在线看| 欧美日韩一区在线| 噜噜噜在线观看播放视频| 午夜美女久久久久爽久久| 欧美午夜网站| 免费看污污视频| 久久99精品久久久久久| 级毛片内射视频| 色综合av在线| 日本在线视频1区| 456国产精品| 欧美电影在线观看免费| 91成人综合网| 成人自拍视频在线观看| 国产高潮国产高潮久久久91| 9191精品国产综合久久久久久| 国产二区视频在线观看| jizzjizz日本少妇| 成人动漫一区二区在线| 日韩黄色免费观看| 欧美精品v国产精品v日韩精品| 韩国福利在线| 国产精品h在线观看| 久久不见久久见国语| 日本www在线播放| 99在线精品一区二区三区| 久久影院一区二区| 精品黑人一区二区三区久久| 日本三级在线观看网站| 成人在线视频网址| 一区在线观看| 中文字幕一区二区人妻电影丶| 亚洲一区免费在线观看| 欧美一区,二区| 97在线免费观看| 一区二区美女| 污污视频网站免费观看| 欧美国产一区二区| 国产一区二区三区三州| 久热国产精品视频| aiss精品大尺度系列| 国产乱子伦农村叉叉叉| 久久久综合激的五月天| 成年人视频免费| 日韩中文字幕在线视频| 欧美影院视频| 欧美日韩黄色一级片| 国产日本欧洲亚洲| 国产精品视频一二区| 欧美日韩电影在线观看| 久久97精品| 能看的毛片网站| 专区另类欧美日韩| 欧美一区二区黄片| 国产精品福利小视频| 久久久久电影| 中国极品少妇xxxx| 欧美丝袜丝交足nylons图片| 顶级网黄在线播放| 精品视频第一区| 美女视频一区在线观看| 国产精品成人国产乱| 亚洲香蕉av在线一区二区三区| 日韩色性视频| 亚洲不卡中文字幕无码| 国产人成亚洲第一网站在线播放| 国产强伦人妻毛片| 欧美在线不卡区| 888久久久| 国产熟妇搡bbbb搡bbbb| 91 com成人网| 在线免费日韩片| 日韩人妻一区二区三区蜜桃视频| av资源站一区| 97精品人妻一区二区三区| 欧美中文字幕在线观看| 综合激情婷婷| 国产精品815.cc红桃| 日韩亚洲欧美一区二区三区|