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

相关推荐
Tyooughtul9 小时前
MySQL篇 索引失效
后端
YMWM_9 小时前
python3中的装饰器介绍及其应用场景
java·后端·spring
sheji34169 小时前
【开题答辩全过程】以 基于Java的饮品店管理系统的实现为例,包含答辩的问题和答案
java·开发语言
大阿明9 小时前
Spring.factories
java·数据库·spring
菜鸟程序员专写BUG9 小时前
SpringBoot 事务失效报错全集|rollback不生效/事务不回滚/传播机制踩坑全解决
java·spring boot·spring
向上_503582919 小时前
配置Protobuf输出Java文件或kotlin文件
android·java·开发语言·kotlin
IAUTOMOBILE9 小时前
C++ 入门基础:开启编程新世界的大门
java·jvm·c++
秋野酱9 小时前
基于springboot的母婴商城系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
踩着两条虫9 小时前
VTJ.PRO 在线应用开发平台的后端模块系统
后端·架构·nestjs
踩着两条虫9 小时前
VTJ.PRO 在线应用开发平台的业务模块(应用、DSL、模板、订单、智能体、技能)
后端·agent·nestjs