开发者学堂课程干货总结——Java 虚拟机原理(六)

简介: Java 虚拟机原理课时1.6——Dragonwell特性:Wisp。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!

各位同学,开发者学堂Java 图谱中Java 高级工程师篇的课程“Java 虚拟机原理”的课程给开始更新了,第六课时“Dragonwell特性:Wisp”的干货总结来啦!一起学习新课程吧!

课程链接以及图谱地址小编已经为大家指路了,搭配学习效果更佳👇

课程名称:Dragonwell特性:Wisp

课程地址:https://developer.aliyun.com/learning/course/56/detail/1191

图谱名称:Alibaba Java 技术图谱

图谱地址:https://developer.aliyun.com/graph/java


Dragonwell特性:Wisp


  1. 协程与异步编程 

1.多线程和事件模型 

Web Server领域,早像Apache Server大家都是使用多线程模型处理并发下图左边这张图是通过多个进程去处理多个用户不同的请求,可能在一个单核系统上也可以去创建多个进程来处理这些请求,但这实际上操作系统给大家一个假象操作系统通过分时互动机制去不停的切换线程,表现出一种正在同时执行的假象。 

image.png 

实际上这个切换是非常消耗资源的,然后我们看右边这张图NGINX,他率先使用了事件模型,让大家科学认知到在单个线程里通过业务代码去切换不同的上下文,这样可以大大减少操作系统里面限制切换开销,很好的提高性能。 

 

2、上下文切换 

上下文切换会吃掉宝贵的CPU资源,大家很多情况下对上下文误区,进出内核和调度之间其实很大差异的。假如像刚才这种场景,我们看到多个线程来回调用那一个线程当它资源耗尽或者比较阻塞的时候,下个线程选谁?其实操作系统需要进行调度真正的损耗远大于想象 

image.png 

我们可以看到进出内核是上图左边灰色这一列,它的耗时是很小的,可能在几十到一百纳秒级别。然后假如这一次系统调用它触发了切换,比如读一个程序里面有数据,信令要挂起会触发上下文切换,如果希望有调度,开销就会很大,会达到40倍左右。 

 

3、使用异步编程 

所以如果在编程中引发调度切换开销是很大的,我们应该尽量避免。怎么避免呢?答案就是异步编程,在node.js里面,我们可以使用大量callback区域处理业务逻辑。当使用callback以后,代码可能会变成这样一种三角形,因为每一个组织方式,它后面返回值都要带callback调用,都会缩进去一层。这样业务逻辑非常难以维护 

其次是即便我使用了异步编程,但可能还是不小心在现实里面使用了一段阻塞代码,下图NGINX官网所提供的图片,虽然我自己去切换不同的请求处理,但是中间可能还是不小心调用了操作系统的一个阻塞方法。 

image.png 

为了解决这个问题,NGINX虽然是一个号称纯异步事件驱动的模型,但是它最近也引入了线程处理这种可能阻塞现实的情况 

 

4、引入协程 

其实最早在操作系统里没有协程概念,大家都是通过协程逻辑上抽象来帮助我们写并发代码。 

image.png   image.png 

比如说这里有两code,一段是解压code,一段 parsercode。大家要从解压数据结构里面去解析数据,这里对数据进行简单的encode,如char普通字符,会直接返回。若是特殊字符,可能就进行一个长度encode用协程来组织逻辑emit() 和 parser::getchar()会切换到另一个协程如果没有协程需两个线程结合pipe来组织但如果协程,我们可以在 frame里面直接控制逻辑清晰且性能高 

我们看怎么实现协程协程执行上下文其实包括这几个部分,当前的站、局部变量代码位置,这些其实都可以通过数据表示 

 image.png 

与OS内的线程切换方式一致 

(1) 保存pc 

(2) 保存sp 

(3) 保存callee-save寄存器 

保存完这些后,将来想回去,只要通过反向计算器pop出来,就会回到之前上下协程场景下,emitgetchar都是通过这种方式去实现的 

 

5、现代编程语言中的协程 

image.png 

左边是VERT.X Java里面最近比较流行的框架,想要制作的就是Java里的node.js的生态,我们可以看到官方所提供的连接数据库例子。 

Client.getConnection,来获取数据库连接,但它不是说立马返回一个连接给到我们,而是提供callback,然后这个result里面表示执行是否成功,如果成功的话,我们可以通过result去拿到 connection这就是通过义务编的方式,去让我们在线程里面处理大的逻辑NGINX就是这样的一种方式。这样代码其实看起来是非常难以维护的,比如在里面需要通过result set去把数据放到缓存里面,又是一个远程调用需要阻塞,可能又是一种callback,这个嵌套会非常深,非常难处理,由于我们都是callback,所以这个就没法被维持,假如在这个地方异常非常难以处理 

现代编程语言是怎么解决这个问题,我们给的答案是ES7C# 他们都提供帮助解决这类问题。我们以一段Kotlin代码为例怎么帮助代码改写成非常直观的代码,Kotlin里面通过suspend关键字来表示,函数是可以被挂起的,然后它也可以在 client上新加的方法,新的方法叫Agetconnection里面调用Kotlin提供的非常 medical的方法,他会获取一个当前执行上下文的connection,让我们getConnection直接调用。getConnectioncallback是恢复当前执行,并且把拿到connection作为返回值。这样实际上不用一直占 CPU资源,实际上调度器会继续去调度其他执行,一旦进行这类封装以后,我们看到代码可以被简化为下面这种形式。 

image.png 

Conn=clinet. AGetConnection(); 

然后 rs= Conn .aQurerythat(“SELECT * FROM ...”) 

这段代码相比左边这段代码那就是大大简化了,但我们要做对这种回调形式进行封装。 

6、Dragonwell: Wisp 原理 

image.png 

既然要对这么多回调形式进行封装,工作量是非常大的,能不能在更底层去解决,为什么就提供了这一层帮助?因为jdk提供所有的阻塞方式都是在jdk里面提供的。比如说Java.lang.Threadj.u.cjava.iosynchronized这些都是有可能阻塞API。在这些API上我们都做了封装, Wisp把这些脏活苦活全部给做掉了. Wisp对现成模型进行一个映射。我们知道Java里面的Java thread和操作系统pthread1:1的映射关系,大量线程使用的话就会导致前面提到的上下切换问题。但是在Wisp下我们每一个线都被映射到一个Wispwisp执行过程中可能阻塞CPU,然后这时候就可以让pthread调动其他Wisp调度效率非常高,可以免费提高应用的性能。 

 

二、使用Wisp提升微服务性能 

Dragonwell: Wisp demo 

下面Dragonwell下用 使用Wisp提高性能的例子 

image.png image.png 

左边这张图是不开Wisp使用wrk压测工具去压这台机器,192.168.1.1018080端口,平均的延迟是522秒,QBS是不到5万,在同个应用完全不改代码情况下,我们调整一下界面参数把Wisp打开,然后线程就被完全意识到协程latency降低到270秒, QBS变成了6万多,大概有20%多的性能提升,这不需要修改任何应用代码是一个免费的性能午餐,所以推荐大家可以通过Wisp提高我们微服务性能表现。 

相关文章
|
1月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
271 0
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
370 1
|
2月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1434 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
2月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
192 3
|
3月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
649 4
|
6月前
|
人工智能 Java 程序员
JManus - 面向 Java 开发者的开源通用智能体
JManus 是一个以 Java 为核心、完全开源的 OpenManus 实现,隶属于 Spring AI Alibaba 项目。它旨在让 Java 程序员更便捷地使用 AI 技术,支持多 Agent 框架、网页配置 Agent、MCP 协议和 PLAN-ACT 模式。项目在 GitHub 上已获近 3k star,可集成多个大模型如 Claude 3.5 和 Qwen3。开发者可通过 IDE 或 Maven 快速运行项目,体验智能问答与工具调用功能。欢迎参与开源共建,推动通用 AI Agent 框架发展。
10184 65
|
5月前
|
SQL 人工智能 Java
阿里云百炼开源面向 Java 开发者的 NL2SQL 智能体框架
Spring-ai-alibaba-nl2sql 是析言 GBI 产品在数据问答领域的一次重要开源尝试,专注于 NL2SQL 场景下的核心能力开放。
1731 48
|
3月前
|
人工智能 自然语言处理 Java
面向 Java 开发者:2024 最新技术栈下 Java 与 AI/ML 融合的实操详尽指南
Java与AI/ML融合实践指南:2024技术栈实战 本文提供了Java与AI/ML融合的实操指南,基于2024年最新技术栈(Java 21、DJL 0.27.0、Spring Boot 3.2等)。主要内容包括: 环境配置:详细说明Java 21、Maven依赖和核心技术组件的安装步骤 图像分类服务:通过Spring Boot集成ResNet-50模型,实现REST接口图像分类功能 智能问答系统:展示基于RAG架构的文档处理与向量检索实现 性能优化:利用虚拟线程、GraalVM等新技术提升AI服务性能 文
389 0
|
11月前
|
Java 开发者
Java 开发者注意!限时招募产品体验官,100% 获得好礼
🚀【开发者福音】SoFlu-JavaAI 开发助手来袭!💻 摆脱熬夜赶需求的压力,SoFlu-JavaAI 助你轻松应对:理清需求、设计架构、编写逻辑与代码、一键构建工程。立即体验高效开发![了解更多](https://mp.weixin.qq.com/s/h9lwDGbwhYodoNjOxsaxIQ) # 产品体验官限时招募中!
Java 开发者注意!限时招募产品体验官,100% 获得好礼