简介
简单认识下阿里开源JDK龙井(Dragonwell)中的特性:协程Wisp,并在不改动代码的情况下使用。
快速使用
咱们先三步走快速把Wisp用起来:下载dragonwell
-> 设置环境变量
-> 设置JVM参数
- 下载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)
/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
- 启动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层面实现的有栈对称式协程。
- JVM层面:Quasar、Kilim等利用字节码实现协程,可以遇见Wisp的性能将会优于他们。
- 有栈协程:有栈协程与无栈协程 - 知乎 (zhihu.com)、浅谈有栈协程与无栈协程 - 知乎 (zhihu.com)
- 对称式协程:协程学习(对称和非对称) - 知乎 (zhihu.com)
- Wisp2兼容现有的代码编写方式,无需添加注解或者重新编译
- Wisp2不打算支持海量的协程,因为目标是兼容现有的Java编程模型
- Wisp最大的优点,我认为是在对现有代码无侵入的情况下,达成目的。
如果想要在现有系统中使用Wisp,请对照该章节:Wisp文档 · dragonwell-project/dragonwell8 Wiki · GitHub,以确保兼容性。
其他
操作系统
5.1 进程、线程基础知识 | 小林coding (xiaolincoding.com)
- 线程
- 用户线程(多对一)的优缺点
- 内核线程(一对一)的优缺点
- 如何理解轻量级线程(LWP)
- 调度
- 调度时机
- 调度原则
- 调度算法
其他协程
- kilim 一文带你彻底了解Java异步编程 - 掘金 (juejin.cn)
- jdk21 Virtual Threads JDK21要来了,协程可以给Java带来什么-阿里云开发者社区 (aliyun.com)、JEP 444: Virtual Threads (openjdk.org)
- open jdk loom 超越传统线程:探索Java Loom协程(纤程/虚拟线程)的无限潜力 - 知乎 (zhihu.com)
- goroutine