阿里开源JDK中的协程Wisp

简介

简单认识下阿里开源JDK龙井(Dragonwell)中的特性:协程Wisp,并在不改动代码的情况下使用。

快速使用

咱们先三步走快速把Wisp用起来:下载dragonwell -> 设置环境变量 -> 设置JVM参数

  1. 下载dragonwell,并解压。
bash 复制代码
wget https://github.com/dragonwell-project/dragonwell8/releases/download/dragonwell-standard-8.16.17_jdk8u382-ga/Alibaba_Dragonwell_Standard_8.16.17_x64_linux.tar.gz
bash 复制代码
tar -zxvf Alibaba_Dragonwell_Extended_8.16.17_x64_linux.tar.gz

其他版本见:Releases · dragonwell-project/dragonwell8 (github.com)

  1. /etc/profile中设置环境变量。

JAVA_HOME=解压后的文件夹路径

bash 复制代码
export JAVA_HOME=/root/java/dragonwell-8.16.17/
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin:$PATH
  1. 启动Java应用时,设置JVM参数。(PingPong替换为应用名)
ruby 复制代码
java -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -XX:ActiveProcessorCount=1 PingPong

没错就是这么简单,你只要用了dragonwell,再设置一下JVM参数,就可以使用协程了,对开发人员透明,无代码侵入。

PingPong测试

指标 参数
CPU&内存 2核(vCPU) 2GiB
操作系统 Alibaba Cloud Linux 3.2104 LTS 64位
JVM版本 dragonwell-8.16.17

进行10万次pingpong测试,结果如下

bash 复制代码
[root@iZ0jl7j6rzccrgjyeqqqcpZ ~]# java PingPong 
2346 ms
bash 复制代码
[root@iZ0jl7j6rzccrgjyeqqqcpZ ~]# java -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -XX:ActiveProcessorCount=1 PingPong
180 ms

Wisp是什么

Dragonwell是阿里内部使用的AJDK的开源版本,而Wisp协程是其特性之一。其他特性见:阿里巴巴Dragonwell8用户指南 · dragonwell-project/dragonwell8 Wiki · GitHub

Java中使用1:1的线程模型,即一个用户线程(Java Thread)映射到一个内核线程(pthread),所以Java中线程的创建、终止和切换都是通过系统调用的方式来进行。

而Wisp在JVM上提供了一种用户态的线程实现,Java线程不对应一个pthread,而是对应到一个协程,JVM可以在少量的内核线程上调度大量的协程,减少内核调度的开销。

官方文档

Wisp文档 · dragonwell-project/dragonwell8 Wiki · GitHub

Wisp2 是在JVM层面实现的有栈对称式协程。

  • Wisp2兼容现有的代码编写方式,无需添加注解或者重新编译
  • Wisp2不打算支持海量的协程,因为目标是兼容现有的Java编程模型
  • Wisp最大的优点,我认为是在对现有代码无侵入的情况下,达成目的。

如果想要在现有系统中使用Wisp,请对照该章节:Wisp文档 · dragonwell-project/dragonwell8 Wiki · GitHub,以确保兼容性。

其他

操作系统

5.1 进程、线程基础知识 | 小林coding (xiaolincoding.com)

  • 线程
    • 用户线程(多对一)的优缺点
    • 内核线程(一对一)的优缺点
    • 如何理解轻量级线程(LWP)
  • 调度
    • 调度时机
    • 调度原则
    • 调度算法

其他协程

协程简史,一文讲清楚协程的起源、发展和实现 (qq.com)

相关推荐
白露与泡影13 小时前
Java虚拟线程实战:从线程池痛点到性能优化全流程
java·开发语言·性能优化
码上有光13 小时前
c++模板进阶知识讲解(对模板的进一步的运用与理解)
java·前端·c++·特化·模板进阶·偏特化
IT空门:门主13 小时前
Java 单例模式详解:7 种实现方式 + volatile 原理 + 反射与序列化问题
java·开发语言·单例模式
来自上海的这位朋友13 小时前
用 Three.js 做一个 Web 3D 非对称追猎 Demo:从场景、角色到手感调试
后端·游戏开发·three.js
SimonKing13 小时前
别再把业务逻辑写进回调接口了!支付回调的正确打开方式
java·后端·程序员
学代码的真由酱13 小时前
Java文档搜索引擎-测试报告
java·自动化测试·功能测试·搜索引擎·性能测试·测试报告
布吉岛的石头13 小时前
Java 程序员第 34 阶段大模型权限与安全设计:接口鉴权与访问控制落地
java·安全·flask
sinat_2554878114 小时前
HTTP、端口、请求、响应、REST
java·网络·网络协议·http·tomcat·intellij-idea
MandalaO_O14 小时前
Java:面向对象 & Spring 框架
java·学习·spring
来自上海的这位朋友14 小时前
Spring Boot + MySQL 搭一个多人游戏后端:登录、房间、匹配、对局和成长系统
前端·后端·three.js