阿里开源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+Vue3)实现共享文档创建与数据统计
java·状态模式·企业微信
橙露19 分钟前
Nginx Location配置全解析:从基础到实战避坑
java·linux·服务器
无敌最俊朗@7 小时前
STL-vector面试剖析(面试复习4)
java·面试·职场和发展
追逐时光者7 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
PPPPickup7 小时前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
LiamTuc7 小时前
Java构造函数
java·开发语言
长安er7 小时前
LeetCode 206/92/25 链表翻转问题-“盒子-标签-纸条模型”
java·数据结构·算法·leetcode·链表·链表翻转
菜鸟plus+7 小时前
N+1查询
java·服务器·数据库
我要添砖java8 小时前
《JAVAEE》网络编程-什么是网络?
java·网络·java-ee
CoderYanger8 小时前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节