一种低性能损耗的安全点中线程栈获取方法、装置及存储介质制造方法及图纸

技术编号:37996599 阅读:10 留言:0更新日期:2023-06-30 10:10
本发明专利技术提出了一种低性能损耗的安全点中线程栈获取方法、装置及存储介质,该方法包括:将opencvjdk源代码中的Threads::print_on函数所引用的本地符号转换为全局符号;判断当前系统的状态是fullgc状态或是高CPU状态;如果当前系统的状态是fullgc状态,则在回调中调用Threads::print_on获取线程栈;如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈。本发明专利技术中,将opencvjdk源代码中的Threads::print_on函数所引用的本地符号转换为全局符号,进而Threads::print_on函数可以被外部调用,使得其可以用于获取线程栈,根据不同的状态采用不同的线程栈获取方式,基本上对CPU的性能不影响,即实现了低性能损耗下的线程栈获取。损耗下的线程栈获取。损耗下的线程栈获取。

【技术实现步骤摘要】
一种低性能损耗的安全点中线程栈获取方法、装置及存储介质


[0001]本专利技术涉及处理器线程控制
,具体涉及一种低性能损耗的安全点中线程栈获取方法、装置及存储介质。

技术介绍

[0002]获取线程栈可以了解当下进程运行情况(每个线程在做什么,运行状态如何,对应哪个高cpu(高cpu含义是指占用CPU过高的线程,如90%以上)的线程号,哪些一直卡着等等)。当前获取java线程栈有以下几个方法:
[0003](1)官方工具jstack:一般情况下可以正确的获取到线程栈。
[0004](2)基于jvmti及AsyncGetCallTrace的工具async

profiler:可以不受安全点限制,一般用于cpu采样,与线程栈获取有区别。
[0005](3)jvm变量HeapDumpBeforeFullGC:告诉虚拟机在fullgc前dump线程栈。
[0006]现有线程栈获取方法及其缺陷:
[0007](1)jstack必须进入到安全点后才能获取到所有线程栈,在fullgc时根本没办法获取。
[0008](2)jvmti使用AsyncGetCallTrace不需要进入安全点,但如果线程已进入安全点,其获取线程栈快速失败,即fullgc时也根本没办法获取到详情,即没有改变fullgc时线程栈获取的失败的情况。
[0009](3)HeapDumpBeforeFullGC是在fllgc前做堆的转储(包含内存、线程栈),但这种性能消耗非常大,不可能用于线上系统。
[0010](4)在高cpu下,jstack与AsyncGetCallTrace均不能占到较高优先级以获取到线程栈。

技术实现思路

[0011]本专利技术针对上述现有技术中一个或多个技术缺陷,提出了如下技术方案。
[0012]一种低性能损耗的安全点中线程栈获取方法,该方法包括:
[0013]转换步骤,将opencvjdk源代码中的Threads::print_on函数所引用的本地符号转换为全局符号;
[0014]判断步骤,判断当前系统的状态是fullgc状态或是高CPU状态;
[0015]获取步骤,如果当前系统的状态是fullgc状态,则在回调中调用Threads::print_on获取线程栈;如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈。
[0016]更进一步地,所述本地符号转换为全局符号的操作为:使用python库lief将所述本地符号转换成全局符号,所述本地符号包括:gclog_or_tty、_ZN7Threads8print_onEP12outputStreambbb、_ZN9Arguments16_gc_log_filenameE、和_Z16ostream_init_
logv。
[0017]更进一步地,所述在回调中调用Threads::print_on获取线程栈的操作为:基于jvmti编写动态库,注册事件JVMTI_EVENT_GARBAGE_COLLECTION_START,在当前系统的状态是fullgc状态激活所述事件JVMTI_EVENT_GARBAGE_COLLECTION_START,通过激活的事件JVMTI_EVENT_GARBAGE_COLLECTION_START激活回调函数CallBack在回调中调用Threads::print_on打印所有线程栈。
[0018]更进一步地,如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈的操作为:基于jvmti编写一个代理函数agent,在所述agent中实现一个函数inner_stack_tty用于调用jvmti的GetAllStackTraces函数以获取所有线程栈,在高cpu状态时,将编写的外部脚本远程注入到一目标进程,在所述目标进程中调用所述agent中的函数inner_stack_tty获取所有线程后并挂起所有线程,然后调用Threads::print_on打印所有线程栈。
[0019]更进一步地,所述Threads::print_on将线程栈打印在gclog_or_tty中,用户通过对gclog_or_tty进行解析获取线程栈。
[0020]本专利技术还提出了一种低性能损耗的安全点中线程栈获取装置,该装置包括:
[0021]转换单元,将opencvjdk源代码中的Threads::print_on函数所引用的本地符号转换为全局符号;
[0022]判断单元,判断当前系统的状态是fullgc状态或是高CPU状态;
[0023]获取单元,如果当前系统的状态是fullgc状态,则在回调中调用Threads::print_on获取线程栈;如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈。
[0024]更进一步地,所述本地符号转换为全局符号的操作为:使用python库lief将所述本地符号转换成全局符号,所述本地符号包括:gclog_or_tty、_ZN7Threads8print_onEP12outputStreambbb、_ZN9Arguments16_gc_log_filenameE、和_Z16ostream_init_logv。
[0025]更进一步地,所述在回调中调用Threads::print_on获取线程栈的操作为:基于jvmti编写动态库,注册事件JVMTI_EVENT_GARBAGE_COLLECTION_START,在当前系统的状态是fullgc状态激活所述事件JVMTI_EVENT_GARBAGE_COLLECTION_START,通过激活的事件JVMTI_EVENT_GARBAGE_COLLECTION_START激活回调函数CallBack在回调中调用Threads::print_on打印所有线程栈。
[0026]更进一步地,如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈的操作为:基于jvmti编写一个代理函数agent,在所述agent中实现一个函数inner_stack_tty用于调用jvmti的GetAllStackTraces函数以获取所有线程栈,在高cpu状态时,将编写的外部脚本远程注入到一目标进程,在所述目标进程中调用所述agent中的函数inner_stack_tty获取所有线程后并挂起所有线程,然后调用Threads::print_on打印所有线程栈。
[0027]更进一步地,所述Threads::print_on将线程栈打印在gclog_or_tty中,用户通过对gclog_or_tty进行解析获取线程栈。
[0028]本专利技术还提出了一种计算机可读存储介质,所述存储介质上存储有计算机程序代
码,当所述计算机程序代码被计算机执行时执行上述之任一的方法。
[0029]本专利技术的技术效果在于:本专利技术的一种低性能损耗的安全点中线程栈获取方法、本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种低性能损耗的安全点中线程栈获取方法,其特征在于,该方法包括:转换步骤,将opencvjdk源代码中的Threads::print_on函数所引用的本地符号转换为全局符号;判断步骤,判断当前系统的状态是fullgc状态或是高CPU状态;获取步骤,如果当前系统的状态是fullgc状态,则在回调中调用Threads::print_on获取线程栈;如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈。2.根据权利要求1所述的方法,其特征在于,所述本地符号转换为全局符号的操作为:使用python库lief将所述本地符号转换成全局符号,所述本地符号包括:gclog_or_tty、_ZN7Threads8print_onEP12outputStreambbb、_ZN9Arguments16_gc_log_filenameE、和_Z16ostream_init_logv。3.根据权利要求2所述的方法,其特征在于,所述在回调中调用Threads::print_on获取线程栈的操作为:基于jvmti编写动态库,注册事件JVMTI_EVENT_GARBAGE_COLLECTION_START,在当前系统的状态是fullgc状态激活所述事件JVMTI_EVENT_GARBAGE_COLLECTION_START,通过激活的事件JVMTI_EVENT_GARBAGE_COLLECTION_START激活回调函数CallBack在回调中调用Threads::print_on打印所有线程栈。4.根据权利要求3所述的方法,其特征在于,如果当前系统的状态是高CPU状态,则挂起所有线程,通过一个代理函数获取线程栈的操作为:基于jvmti编写一个代理函数agent,在所述agent中实现一个函数inner_stack_tty用于调用jvmti的GetAllStackTraces函数以获取所有线程栈,在高cpu状态时,将编写的外部脚本远程注入到一目标进程,在所述目标进程中调用所述agent中的函数inner_stack_tty获取所有线程后并挂起所有线程,然后调用Threads::print_on打印所有线程栈。5.根据权利要求4所述的方法,其特征在于,所述Threads::print_on将线程栈打印在gclog_or_tty中,用户通过对gclog_or_tty进行解析获取线程栈。6.一种...

【专利技术属性】
技术研发人员:许友正梅国赠郑保顺胡豪杰伍晓军李中辉黄文质
申请(专利权)人:智业互联厦门健康科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1