我的编程空间,编程开发者的网络收藏夹
学习永远不晚

jvm线程变化是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

jvm线程变化是怎样的

这篇文章主要介绍“jvm线程变化是怎样的”,在日常操作中,相信很多人在jvm线程变化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm线程变化是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

jvm线程是维护了线程的状态。new,running,waiting,timed waiting,blocked,terminated。我们通过jstack等工具查看的时候,线程状态就是上面的一种。jvm本身是做了一种抽象,我们现在从一个典型的方法,来跟踪查看一下jvm内部又是怎么做状态变化的。

sleep方法入手

   public static native void sleep(long millis) throws InterruptedException;

sleep是一个native 方法,我们通过jvm原来来进行跟着(源码来自openjdk11)。根据jni的规范,我们通过包名或者是jni的注册方式找到了对应的声明。

static JNINativeMethod methods[] = {
   {"start0",           "()V",        (void *)&JVM_StartThread},
   {"stop0",            "(" OBJ ")V", (void *)&JVM_StopThread},
   {"isAlive",          "()Z",        (void *)&JVM_IsThreadAlive},
   {"suspend0",         "()V",        (void *)&JVM_SuspendThread},
   {"resume0",          "()V",        (void *)&JVM_ResumeThread},
   {"setPriority0",     "(I)V",       (void *)&JVM_SetThreadPriority},
   {"yield",            "()V",        (void *)&JVM_Yield},
   {"sleep",            "(J)V",       (void *)&JVM_Sleep},
   {"currentThread",    "()" THD,     (void *)&JVM_CurrentThread},
   {"countStackFrames", "()I",        (void *)&JVM_CountStackFrames},
   {"interrupt0",       "()V",        (void *)&JVM_Interrupt},
   {"isInterrupted",    "(Z)Z",       (void *)&JVM_IsInterrupted},
   {"holdsLock",        "(" OBJ ")Z", (void *)&JVM_HoldsLock},
   {"getThreads",        "()[" THD,   (void *)&JVM_GetAllThreads},
   {"dumpThreads",      "([" THD ")[[" STE, (void *)&JVM_DumpThreads},
   {"setNativeName",    "(" STR ")V", (void *)&JVM_SetNativeThreadName},
};

接下来我们要跟踪的就是JVM_Sleep了。我们一点一点来解析这个方法。首先这里有宏定义。

JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))

我们展开JVM_ENTRY。

#define JVM_ENTRY(result_type, header)                               \
extern "C" {                                                         \
 result_type JNICALL header {                                       \
   JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
   ThreadInVMfromNative __tiv(thread);                              \
   debug_only(VMNativeEntryWrapper __vew;)                          \
   VM_ENTRY_BASE(result_type, header, thread)

在ThreadInVMfromNative中,发生了一次线程状态的变更。

class ThreadInVMfromNative : public ThreadStateTransition {
public:
 ThreadInVMfromNative(JavaThread* thread) : ThreadStateTransition(thread) {
   trans_from_native(_thread_in_vm);
 }
 ~ThreadInVMfromNative() {
   trans_and_fence(_thread_in_vm, _thread_in_native);
 }
};

在构造方法中把JavaThread的**thread->thread_state()**状态变为了_thread_in_vm。在析构函数中把状态改成了_thread_in_native。这里的__tiv是一个本地对象,只有在栈销毁的时候才会触发析构,也就是说这里的转为_thread_in_native只不过是一瞬间的事情。展开头结束后,我们再继续往后观察。

  JavaThreadSleepState jtss(thread);

在这个构造方法中。把**java_thread->threadObj()**的状态变为了
java_lang_Thread::SLEEPING

  static void set_thread_status(JavaThread* java_thread,
                               java_lang_Thread::ThreadStatus state) {
   java_lang_Thread::set_thread_status(java_thread->threadObj(), state);
 }

这里对应的就是java的线程的状态了。在往下走就直接设置**thread->osthread()**的状态为sleep。

    ThreadState old_state = thread->osthread()->get_state();
   thread->osthread()->set_state(SLEEPING);

状态到这里全部设置完成。

状态梳理

通过上面的代码,我们可以发现最核心的就是JavaThread的这个对象,他本身代表的jvm中的线程状态。会标识线程是在vm还是线程是在java或者在native。具体的状态如下

enum JavaThreadState {
 _thread_uninitialized     =  0, // should never happen (missing initialization)
 _thread_new               =  2, // just starting up, i.e., in process of being initialized
 _thread_new_trans         =  3, // corresponding transition state (not used, included for completness)
 _thread_in_native         =  4, // running in native code
 _thread_in_native_trans   =  5, // corresponding transition state
 _thread_in_vm             =  6, // running in VM
 _thread_in_vm_trans       =  7, // corresponding transition state
 _thread_in_Java           =  8, // running in Java or in stub code
 _thread_in_Java_trans     =  9, // corresponding transition state (not used, included for completness)
 _thread_blocked           = 10, // blocked in vm
 _thread_blocked_trans     = 11, // corresponding transition state
 _thread_max_state         = 12  // maximum thread state+1 - used for statistics allocation
};

这个类同时那种java线程状态的引用。就是java_thread->threadObj()。这个对应的是java的线程状态,这个也是我们jstack看到的状态。

"main" #1 prio=5 os_prio=31 tid=0x00007fee9b809000 nid=0xe03 waiting on condition [0x0000700008d65000]
  java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.company.Sleep.main(Sleep.java:7)

为什么输出的是timed_waiting(sleep),这个主要是因为格式化输出的原因。

    if(status == THREAD_STATUS_NEW){
     return "NEW";
   }else if(status == THREAD_STATUS_RUNNABLE){
     return "RUNNABLE";
   }else if(status == THREAD_STATUS_SLEEPING){
     return "TIMED_WAITING (sleeping)";
   }else if(status == THREAD_STATUS_IN_OBJECT_WAIT){
     return "WAITING (on object monitor)";
   }else if(status == THREAD_STATUS_IN_OBJECT_WAIT_TIMED){
     return "TIMED_WAITING (on object monitor)";
   }else if(status == THREAD_STATUS_PARKED){
     return "WAITING (parking)";
   }else if(status == THREAD_STATUS_PARKED_TIMED){
     return "TIMED_WAITING (parking)";
   }else if(status == THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER){
     return "BLOCKED (on object monitor)";
   }else if(status == THREAD_STATUS_TERMINATED){
     return "TERMINATED";
   }
   return "UNKNOWN";
 }

在状态格式化的时候,把sleeping的归类成为TIMED_WAITING (sleeping)。于此同时Java Thread还拿着系统的线程thread->osthread()。

到此,关于“jvm线程变化是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

jvm线程变化是怎样的

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

下载Word文档

猜你喜欢

jvm线程变化是怎样的

这篇文章主要介绍“jvm线程变化是怎样的”,在日常操作中,相信很多人在jvm线程变化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm线程变化是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-03

线上JVM是怎么优化的

本篇内容介绍了“线上JVM是怎么优化的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JVM的内存模型是什么样子的?JVM内存模型可以大致可划
2023-06-04

JVM类加载过程是怎样的

小编给大家分享一下JVM类加载过程是怎样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机
2023-06-02

JVM中的栈和局部变量是怎么样的

这篇文章给大家介绍JVM中的栈和局部变量是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核
2023-06-17

JVM优化配置指导是怎么样的

JVM优化配置指导是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。本文向大家简单介绍一下JVM优化配置的概念,通常情况下是不建议在没有任何统计和分析的情况下去手动配置J
2023-06-17

JVM内存的结构是怎样的

这篇文章主要介绍“JVM内存的结构是怎样的”,在日常操作中,相信很多人在JVM内存的结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-02

Java线程状态是怎样的

这篇文章主要介绍“Java线程状态是怎样的”,在日常操作中,相信很多人在Java线程状态是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程状态是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-19

Python可视化的折线图是怎样的

本篇文章给大家分享的是有关Python可视化的折线图是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。摘要: 利用matplotlib绘制横轴为日期格式的折线图时,存在不少
2023-06-02

JVM是怎样运行Java代码的

这篇文章主要介绍“JVM是怎样运行Java代码的”,在日常操作中,相信很多人在JVM是怎样运行Java代码的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM是怎样运行Java代码的”的疑惑有所帮助!接下来
2023-06-03

Python主线程销毁子线程过程是怎样的

Python主线程销毁子线程过程是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在处理完成后,Python主线程将销毁线程,其实Python主线程的销毁与
2023-06-17

JVM中内存结构是怎么样的

这篇文章主要介绍了JVM中内存结构是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。图为Java虚拟机运行时的数据区: 1.方法区 也称"永久代” 、“非堆”, 它
2023-06-02

Python 3.1核心语言的变化是怎么样的

Python 3.1核心语言的变化是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。这里我们将对Python 3.1核心语言的变化进行分析,包括字符串的格式化、说明符以及
2023-06-17

JVM监控工具用法是怎么样的

JVM监控工具用法是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。你对JVM监控工具的用法是否了解,这里向大家描述几种,VisualVM是一种集成了多个JDK命令行工具
2023-06-17

Unity渲染管线流程是怎样的

本篇内容介绍了“Unity渲染管线流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是《Unity Shader 入门精要》一书
2023-06-22

Java多线程发展史是怎样的

本篇内容主要讲解“Java多线程发展史是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程发展史是怎样的”吧!JDK 1.01996年1月的JDK1.0版本,从一开始就确立了Ja
2023-06-17

WCF序列化流程是怎样的

本篇内容介绍了“WCF序列化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么WCF序列化:我们这里先来介绍一下为什么需要序列
2023-06-17

Flutter初始化流程是怎样的

本篇内容介绍了“Flutter初始化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flutter初始化时序Flutter初始化主
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录