Go语言出现后,Java还是最佳选择吗?

随着Go等支持协程语言的出现,有人质疑Java是否仍适合云场景。阿里JVM团队开发的Wisp2将Go的协程引入Java,使Java兼顾丰富生态和高性能。Wisp2避免了线程上下文切换的开销,通过协程实现更精确的线程控制,解决了synchronized和Object.wait()可能导致的问题,提升了对异步框架的适应性。
摘要由CSDN通过智能技术生成
640?wx_fmt=jpeg

阿里妹导读:随着大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈,Java也因此被质疑是否不再适应最新的云场景了。4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。既享受Java的丰富生态,又获得异步程序的性能,Wisp2让Java平台历久弥新。


Java平台一直以生态的繁荣著称,大量的类库、框架帮助开发者们快速搭建应用。 而其中大部分Java框架类库都是基于线程池以及阻塞机制来服务并发的,主要原因包括:


1. Java语言在核心类库中提供了强大的并发能力,多线程应用可以获得不俗的性能;
2. Java EE的一些标准都是线程级阻塞的(比如JDBC);
3. 基于阻塞模式可以快速地开发应用。

但如今,大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈。 Java也因此被质疑是否不再适应最新的云场景了。

4年前,阿里开始自研Wisp2。 它主要是用在IO密集的服务器场景,大部分公司的在线服务都是这样的场景  (离线应用都是偏向于计算,则不适用)。 它在功能属性上对标Goroutine的Java协程,在产品形态、性能、稳定性上都达到了一个比较理想的情况。 到现在 ,已经有上百个应用,数万个容器上线了Wisp1/2。 Wisp协程完全兼容多线程阻塞的代码写法,仅需增加JVM参数来开启协程,阿里巴巴的核心电商应用已经在协程模型上经过两个双十一的考验,既享受到了Java的丰富生态,又获得了异步程序的性能。

Wisp2主打的是 性能和对现有 代码的兼容性,简而言之,现有的基于 多线程的IO密集的Java应用只需要加上Wisp2的JVM参数就可以获得异步的性能提升。

作为例子,以下是消息中间件代理(简称mq)和drds只添加参数不改代码的压测比较:

640?wx_fmt=png


可以看到上下文切换以及sys CPU显著降低,RT减少、QPS分别提升11.45%,18.13%。

Quick Start

由于Wisp2完全兼容现有的Java代码,因此使用起来十分简单,有多简单?

如果你的应用是“标准”的在线应用(使用/home/admin/$APP_NAME/setenv.sh配置参数),那么 在admin用户下输入如下命令就可以开启Wisp2了:

 
curl https://gosling.alibaba-inc.com/sh/enable-wisp2.sh | sh

否则需要手动升级JDK和Java参数:

ajdk 8.7.12_fp2 rpm

 
sudo yum install ajdk -b current # 也可以通过yum安装最新jdk
java -XX:+UseWisp2 .... # 使用Wisp参数启动Java应用

然后就可以通过jstack验证协程确实被开启了。

Carrier线程是调度协程的线程,下方的- Coroutine [...]表示一个协程,active表示协程被调度的次数,steal表示被work stealing的次数,preempt表示时间片抢占次数。

640?wx_fmt=png

下图是DRDS在ecs上压测时的top -H,可以看出来应用的数百个线程被8个Carrier线程托管,均匀地跑在CPU核数个线程上面。下方一些名为java的线程是gc线程。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值