阿里开源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)

相关推荐
平凡运维之路几秒前
端口转发
后端
运维@小兵5 分钟前
Spring-AI系列——Tool Calling获取当前时间
java·后端·spring
认真敲代码的小火龙7 分钟前
【JAVA项目】基于JAVA的养老院管理系统
java·开发语言·课程设计
he___H8 分钟前
滑动窗口一题
java·数据结构·算法·滑动窗口
扶苏-su9 分钟前
Java---事件处理机制
java·开发语言
雨中飘荡的记忆10 分钟前
Hutool工具库实战
java
Java水解13 分钟前
前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践
前端·后端
镜花水月linyi19 分钟前
Java 线程创建的完整链路:从 Java 层 → JVM 层 → 操作系统层
java·后端·面试
zfj32125 分钟前
排查java应用内存溢出的工具和方法
java·开发语言·jvm·内存溢出
历程里程碑35 分钟前
C++ 7vector:动态数组的终极指南
java·c语言·开发语言·数据结构·c++·算法