iis服务器助手广告
返回顶部
首页 > 资讯 > 操作系统 >如何分析Java开源工具在linux上的信号处理
  • 765
分享到

如何分析Java开源工具在linux上的信号处理

2023-06-17 11:06:27 765人浏览 薄情痞子
摘要

今天就跟大家聊聊有关如何分析Java开源工具在linux上的信号处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在th

今天就跟大家聊聊有关如何分析Java开源工具linux上的信号处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在thread.cpp里的create_vm方法体里实现。

而在thread.cpp里主要起了2个线程来处理信号相关的:

JVMtiExport::enter_live_phase();   // Signal Dispatcher needs to be started before VMInit event is posted  os::signal_init();   // Start Attach Listener if +StartAttachListener or it can't be started lazily  if (!DisableAttachMechanism) {    if (StartAttachListener || AttachListener::init_at_startup()) {      AttachListener::init();    }  }

1. Signal Dispatcher 线程

在os.cpp中的signal_init()函数中,启动了signal dispatcher 线程,对signal dispather 线程主要是用于处理信号,等待信号并且分发处理,可以详细看signal_thread_entry的方法:

static void signal_thread_entry(JavaThread* thread, TRAPS) {    os::set_priority(thread, NearMaxPriority);    while (true) {      int sig;      {        // FIXME : Currently we have not decieded what should be the status        //         for this java thread blocked here. Once we decide about        //         that we should fix this.        sig = os::signal_wait();      }      if (sig == os::sigexitnum_pd()) {         // Terminate the signal thread         return;      }       switch (sig) {        case SIGBREAK: {          // Check if the signal is a trigger to start the Attach Listener - in that          // case don't print stack traces.          if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {            continue;          }          // Print stack traces          // Any SIGBREAK operations added here should make sure to flush          // the output stream (e.g. tty->flush()) after output.  See 4803766.          // Each module also prints an extra carriage return after its output.          VM_PrintThreads op;          VMThread::execute(&op);          VM_PrintJNI jni_op;          VMThread::execute(&jni_op);          VM_FindDeadlocks op1(tty);          VMThread::execute(&op1);          Universe::print_heap_at_SIGBREAK();          if (PrintClasshistogram) {            VM_GC_Heapinspection op1(gclog_or_tty, true ,                                     true );            VMThread::execute(&op1);          }          if (JvmtiExport::should_post_data_dump()) {            JvmtiExport::post_data_dump();          }          break;        }        default: {          // Dispatch the signal to java          HandleMark hm(THREAD);          klassOop k = SystemDictionary::resolve_or_null(vmSymbolHandles::sun_misc_Signal(), THREAD);          KlassHandle klass (THREAD, k);          if (klass.not_null()) {            JavaValue result(T_VOID);            JavaCallArguments args;            args.push_int(sig);            JavaCalls::call_static(              &result,              klass,              vmSymbolHandles::dispatch_name(),              vmSymbolHandles::int_void_signature(),              &args,              THREAD            );          }          if (HAS_PENDING_EXCEPTION) {            // tty is initialized early so we don't expect it to be null, but            // if it is we can't risk doing an initialization that might            // trigger additional out-of-memory conditions            if (tty != NULL) {              char klass_name[256];              char tmp_sig_name[16];              const char* sig_name = "UNKNOWN";              instanceKlass::cast(PENDING_EXCEPTION->klass())->                name()->as_klass_external_name(klass_name, 256);              if (os::exception_name(sig, tmp_sig_name, 16) != NULL)                sig_name = tmp_sig_name;              warning("Exception %s occurred dispatching signal %s to handler"                     "- the VM may need to be forcibly terminated",                      klass_name, sig_name );            }            CLEAR_PENDING_EXCEPTION;          }        }      }    }  }

可以看到通过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 方法体中实现:

static void attach_listener_thread_entry(JavaThread* thread, TRAPS) {    os::set_priority(thread, NearMaxPriority);     if (AttachListener::pd_init() != 0) {      return;    }    AttachListener::set_initialized();     for (;;) {      AttachOperation* op = AttachListener::dequeue();         if (op == NULL) {        return;   // dequeue failed or shutdown      }       ResourceMark rm;      bufferedStream st;      jint res = JNI_OK;       // handle special detachall operation      if (strcmp(op->name(), AttachOperation::detachall_operation_name()) == 0) {        AttachListener::detachall();      } else {        // find the function to dispatch too        AttachOperationFunctionInfo* info = NULL;        for (int i=0; funcs[i].name != NULL; i++) {          const char* name = funcs[i].name;          assert(strlen(name) <= AttachOperation::name_length_max, "operation <= name_length_max");          if (strcmp(op->name(), name) == 0) {            info = &(funcs[i]);            break;          }        }         // check for platfORM dependent attach operation        if (info == NULL) {          info = AttachListener::pd_find_operation(op->name());        }         if (info != NULL) {          // dispatch to the function that implements this operation          res = (info->func)(op, &st);        } else {          st.print("Operation %s not recognized!", op->name());          res = JNI_ERR;        }      }       // operation complete - send result and output to client      op->complete(res, &st);    }  }

在AttachListener::dequeue(); 在liunx里的实现就是监听刚才创建的socket的文件,如果有请求进来,找到请求对应的操作,调用操作得到结果并把结果写到这个socket的文件,如果你把socket的文件删除,jstack/jmap会出现错误信息 unable to open socket file:........

我们经常使用 kill -3 pid的操作打印出线程栈信息,我们可以看到具体的实现是在Signal Dispatcher 线程中完成的,因为kill -3 pid 并不会创建.attach_pid#pid文件,所以一直初始化不成功,从而线程的栈信息被打印到控制台中。

看完上述内容,你们对如何分析Java开源工具在linux上的信号处理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网操作系统频道,感谢大家的支持。

--结束END--

本文标题: 如何分析Java开源工具在linux上的信号处理

本文链接: https://www.lsjlt.com/news/288514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何分析Java开源工具在linux上的信号处理
    今天就跟大家聊聊有关如何分析Java开源工具在linux上的信号处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在th...
    99+
    2023-06-17
  • Java开源工具在linux上执行的线程是什么
    本篇内容介绍了“Java开源工具在linux上执行的线程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Attach Listener ...
    99+
    2023-06-17
  • Java开源工具在linux上的跟踪方式有哪些
    这篇文章主要为大家展示了“Java开源工具在linux上的跟踪方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java开源工具在linux上的跟踪方式有哪些”这篇文章吧。在我们常用的Js...
    99+
    2023-06-17
  • 聚星C#数字信号处理工具包频谱分析的用法
    目录聚星C#数字信号处理工具包频谱分析JXI C# DSP Tools, Spectrum AnalysisC# 数字信号处理工具包 DSP-Core 重采样(Resample)输出...
    99+
    2023-02-26
    C#频谱分析 C#数字信号处理 C#工具包
  • 如何用源码分析在linux上的safe point
    这篇文章将为大家详细讲解有关如何用源码分析在linux上的safe point,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。safe point 顾明思意,就是安全点,当需要jvm做一些操作...
    99+
    2023-06-17
  • C#数字信号处理工具包如何使用
    这篇文章主要介绍“C#数字信号处理工具包如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#数字信号处理工具包如何使用”文章能帮助大家解决问题。JXI C# DSP Tools, Spectr...
    99+
    2023-07-05
  • Linux中Shell文本处理工具的示例分析
    这篇文章给大家分享的是有关Linux中Shell文本处理工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。提供的例子和参数都是最常用和最为实用的;我对shell脚本使用的原则是命令单行书写,尽量不要超过...
    99+
    2023-06-13
  • 怎么用源码分析在linux上符号表的读取
    这期内容当中小编将会给大家带来有关怎么用源码分析在linux上符号表的读取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有...
    99+
    2023-06-17
  • 如何理解Linux系统IO分析工具的iotop参数
    这篇文章主要讲解了“如何理解Linux系统IO分析工具的iotop参数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Linux系统IO分析工具的iotop参数”吧!简介:iotop ...
    99+
    2023-06-13
  • 如何在Linux中使用awk文本处理工具
    本篇文章为大家展示了如何在Linux中使用awk文本处理工具,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下:  [chengmo@localhost ~]$ awk &lsquo;B...
    99+
    2023-06-13
  • Linux服务器上必备的4个开源工具分别是哪几个
    Linux服务器上必备的4个开源工具分别是哪几个,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. SambaSamba是种自由软件,用来让UNIX系列的操作系统与微软Wi...
    99+
    2023-06-15
  • 让Linux成为理想的工作站的3个开源工具分别是什么
    让Linux成为理想的工作站的3个开源工具分别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Linux 不但拥有你认为所需的一切,还有更多可以让你高效工作...
    99+
    2023-06-15
  • 在LINUX系统中Fedora yum管理工具的使用分析
    本篇文章给大家分享的是有关在LINUX系统中Fedora yum管理工具的使用分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Fedora yum管理工具还是比较常用的,于是...
    99+
    2023-06-16
  • 如何处理 Java IDE 在 Linux 上的加载问题?
    Java IDE 是 Java 程序员必不可少的工具。但是在 Linux 上使用 Java IDE 时,可能会遇到加载问题。本文将介绍如何处理 Java IDE 在 Linux 上的加载问题,并演示一些代码。 问题描述 当我们在 Linux...
    99+
    2023-09-09
    ide load linux
  • linux文本处理工具及正则表达式的示例分析
    这篇文章主要介绍linux文本处理工具及正则表达式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!cat命令:查看文本内容       &...
    99+
    2023-06-09
  • 如何在Linux上使用Java开发自然语言处理应用?
    在当今人工智能应用的大背景下,自然语言处理技术越来越成为研究热点。而Java作为一种跨平台的编程语言,也被广泛应用于自然语言处理领域。本文将介绍在Linux系统下如何使用Java开发自然语言处理应用,并穿插演示代码。 一、Java环境配置 ...
    99+
    2023-08-01
    linux 自然语言处理 spring
  • 如何在Linux中获取CPU信息的简单CLI工具
    这篇文章主要讲解了“如何在Linux中获取CPU信息的简单CLI工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Linux中获取CPU信息的简单CLI工具”吧!CPUFetch是一个...
    99+
    2023-06-15
  • 如何用图形工具管理Server Core上的账号和组
    如何用图形工具管理Server Core上的账号和组,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  1.1 管理Server Core上的账号和组  由于Wi...
    99+
    2023-06-14
  • 使用numpy和Python在Linux上创建高效的日志记录和分析工具。
    使用numpy和Python在Linux上创建高效的日志记录和分析工具 随着互联网技术的不断发展,日志记录和分析成为了许多公司和组织必不可少的一项工作。在Linux系统上,我们可以使用numpy和Python来创建一个高效的日志记录和分析工...
    99+
    2023-08-10
    numpy 日志 linux
  • Java实时自然语言处理:优化日志分析的必备工具!
    随着互联网的普及,日志文件的大小和数量也在不断增长,这些日志文件中包含了大量的信息,但是如何从中提取出有价值的信息却成为了一个挑战。传统的日志分析方式需要人工逐条查看日志,这样的方式效率低下且容易出错。而随着自然语言处理技术的发展,我们可...
    99+
    2023-06-26
    实时 自然语言处理 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作