springboot线程

(1)确保只有一个线程调用这个方法并且确保只创建一个HotSpot VM实例。因为HotSpot VM创建的静态数据结构无法再次初始化,所以一旦初始化到达某个确定点后,进程空间里就只能有一个HotSpot VM,在HotSpot VM的开发工程师看来,HotSpot VM启动至此已经是无法逆转了。

(2)检查并确保支持当前的JNI版本,初始化垃圾收集日志的输出流。

(3)初始化OS模块,如随机数生成器(Random Number Generator)、当前进程id(Current Process id)、高精度计时器(High-Resolution Timer)、内存页尺寸(Memory Page Sizes)、保护页(Guard Pages)。保护页是不可访问的内存页,用作内存访问区域的边界。例如,操作系统常在线程栈顶压入一个保护页以保证引用不会超出栈的边界。

(4)解析传入JNI_CreateJavaVM的命令行选项,保存以备将来使用。

(5)初始化标准的Java系统属性,例如java.version、java.vendor、os.name等。

(6)初始化支持同步、栈、内存和安全点页的模块。

(7)加载libzip、libhpi、libjava及libthread等库。

(8)初始化并设置信号处理器(Signal Handler)。

(9)初始化线程库。

(10)初始化输出流日志记录器(Logger)。

(11)如果用到Agent库(hprof、jdi),则初始化并启动。

(12)初始化线程状态(Thread State)和线程本地存储(Thread Local Storage),它们存储了线程私有数据。

(13)初始化部分HotSpot VM全局数据,例如事件日志(Event Log),OS同步原语、perfMemory(性能统计数据内存),以及chunkPool(内存分配器)。

(14)至此,HotSpot VM可以创建线程了。创建出来的Java版main线程被关联到当前操作系统线程,只不过还没有添加到已知线程列表中。

(15)初始化并激活Java级别的同步。

(16)初始化启动类加载器(Bootclassloader)、代码缓存、解释器、JIT编译器、JNI、系统词典(System Dictionary)及universe(一种必备的全局数据结构集)。

(17)现在,添加Java主线程到已知线程列表中。检查universe是否正常。创建HotSpot VMThread,它执行HotSpot VM所有的关键功能。同事发出适当的JVMTI事件,报告HotSpot VM当前的状态。

(18)加载和初始化以下Java类:java.lang.String、java.lang.System、java.lang.Thread、java.lang.ThreadGroup、java.lang.reflect.Method、java.lang.ref.Finalizer、java.lang.Class以及余下的Java系统类。此时,HotSpot已经初始化完毕并可使用,只是功能还不完备。

(19)启动HotSpot VM的信号处理器线程,初始化JIT编译器并启动HotSpot编译代理线程。启动HotSpot VM辅助线程(如监控线程和统计抽样器)。至此,HotSpot VM已功能完备。

(20)最后,生成JNIEnv对象返回给调用者,HotSpot则准备响应新的JNI请求。

(1)一直等待,直到只有一个非守护的线程执行,注意此时HotSpot VM仍然可用。

(2)调用java.lang.Shutdown.shutdown(),它会调用Java上的shutdown钩子方法,如果finalization-on-exit为true,则运行Java对象的finalizer。

(3)运行HotSpot VM上的shutdown钩子(通过JVM_OnExit()注册),停止以下线程:性能分线器、统计数据抽样器、监控线程及垃圾收集器线程。发出状态事件通知JVMTI,然后关闭JVMTI、停止信号线程。

(4)调用HotSpot的JavaThread::exit()释放JNI处理块,移除保护页,并将当前线程从已知线程队列中移除。从这时起,HotSpot VM就无法执行任何Java代码了。

(5)停止HotSpot VM线程,将遗留的HotSpot VM线程带到安全点并停止JIT编译器线程。

(6)停止追踪JNI,HotSpot VM及JVMTI屏障。

(7)为哪些仍然以本地代码运行的线程设置标记”vm exited”。

(8)删除当前线程。

(9)删除或移除所有的输入/输出流,释放PerfMemory(性能统计内存)资源。

(10)最后返回到调用者。

Original: https://www.cnblogs.com/handsomecui/p/13738986.html
Author: handsomecui
Title: springboot线程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541228/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mongodb oplog日志详解和格式分析

    基本概念 oplog使用固定大小集合记录了数据库中所有修改操作的操作日志(新增、修改和删除,无查询),其记录每条记录被修改后的数据,等同于MYSQL中ROW类型的binlog。mo…

    Java 2023年6月6日
    078
  • Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

    Original: https://www.cnblogs.com/libin6505/p/16446784.htmlAuthor: 戈博折刀Title: Java使用Cipher…

    Java 2023年5月29日
    079
  • 【Seata】最新1.5.2版本的 mysql 的sql文件位置

    seata-server-1.5.2\seata\script\server\db\mysql.sql Original: https://www.cnblogs.com/Hypo…

    Java 2023年6月15日
    085
  • [推荐]MyBatis 核心技术与面试 34 讲

    MyBatis 核心技术与面试 34 讲 职业生涯中常被问到: 如何成为某方面的高手? 如何快速搞定某项技术? 我现在的水平处于什么阶段? …… 我暗暗想,…

    Java 2023年5月30日
    0209
  • LeetCode剑指Offer刷题总结(四)

    class Solution { public List> levelOrder(TreeNode root) { Deque deque = new LinkedList&…

    Java 2023年6月7日
    083
  • Rocket Mq 常用API 及简单运维

    RocketMQ 常用API 消息 消息消费模式 消息消费模式由消费者来决定,可以由消费者设置MessageModel来决定消息模式。 消息模式默认为集群消费模式 consumer…

    Java 2023年6月7日
    084
  • nginx配置http为1.0到1.1

    转载自:https://blog.csdn.net/u014558668/article/details/79237020 需求:接口通过nginx转发服务器,接收不到数据,但是测…

    Java 2023年5月30日
    087
  • 基于 Github Actions 自动部署 Hexo 博客

    前言 前不久使用了 Hexo 搭建独立博客,我是部署在我的腾讯云轻量应用服务器上的,每次都需要 hexo deploy 然后打包、上传、解压和刷新 CDN,非常麻烦。我的服务器配置…

    Java 2023年6月8日
    0146
  • Kafka 分区

    一、副本机制 Kafka在⼀定数量的服务器上对主题分区进⾏复制。 当集群中的⼀个broker宕机后系统可以⾃动故障转移到其他可⽤的副本上,不会造成数据丢失。 创建主题: kafka…

    Java 2023年6月5日
    084
  • 某CTF比赛writeup

    看到群里别人参加比赛发上来的附件,自己尝试解了一下。 1、提示RSA,提供flag.enc和pub.key附件 一看就是解RSA,公钥分解得到n和e n=8693448229604…

    Java 2023年6月5日
    095
  • 理解:语法树,短语,直接短语,句柄

    概念: 语法树求短语、简单短语和句柄: 1)短语:子树的末端结点形成的符号串。 2)简单子树:只有一层分支的子树。 3)直接短语(简单短语):简单子树的末端结点形成的符号串。 4)…

    Java 2023年6月7日
    092
  • 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等。 这一回,我们来对 Base64 这一常…

    Java 2023年6月5日
    082
  • JAVA中容器设计的进化史:从白盒到黑盒,再到跻身为设计模式之一的迭代器

    大家好,又见面了。 在我们的项目编码中,不可避免的会用到一些 容器类,我们可以直接使用 List、 Map、 Set、 Array等类型。当然,为了体现业务层面的含义,我们也会根据…

    Java 2023年6月7日
    0109
  • 解析协同办公“协同”为何意,数字化办公又如何轻松“破题”?

    “协同办公”这个词在我们的工作场上出现的几率非常高,但如果要问协同办公协同的到底是什么,是怎样协同的,相信很多人是回答不出来的。 偶然间想到这个问题,于是便…

    Java 2023年6月5日
    093
  • mybatisPlus整理

    1.在启动类上面添加@MapperScan注解,扫描mapper包 1 @SpringBootApplication 2 @MapperScan("com.qiao.de…

    Java 2023年5月30日
    081
  • 微信扫码登录

    微信扫码登录 1. 使用背景 如今开发业务系统,已不是一个单独的系统。往往需要同多个不同系统相互调用,甚至有时还需要跟微信,钉钉,飞书这样平台对接。目前我开发的部分业务系统,已经完…

    Java 2023年6月13日
    0255
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球