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

相关推荐
小华同学ai1 分钟前
炸裂!Github 6000+ star 开源免费易用,支持1000+格式转换,值得收藏!
前端·后端·github
BillKu30 分钟前
Spring Boot Controller 使用 @RequestBody + @ModelAttribute 接收请求
java·spring boot·后端
程序员爱钓鱼37 分钟前
Go语言实战案例-Redis连接与字符串操作
后端·google·go
chenglin0161 小时前
C#_接口设计:角色与契约的分离
java·前端·c#
chenglin0161 小时前
ES_多表关联
java·前端·elasticsearch
l5657582 小时前
第四十二天(Java开发 &Servlet&Filter & Lister)
java·笔记
杯莫停丶2 小时前
Spring Boot全局异常捕获指南
java·spring boot
许苑向上2 小时前
【BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 详细解答】
java·spring boot·启动流程
admiraldeworm9 小时前
Spring Boot + Spring AI 最小可运行 Demo
java·人工智能·ai
chenglin0169 小时前
ES_数据存储知识
java·服务器·elasticsearch