• 阿里开源JDK dragonwell8在容器环境使用


    Alibaba Dragonwell 是阿里巴巴的Open JDK 发行版,提供长期支持。 阿里宣传称在阿里生产环境实现了应用。Alibaba Dragonwell兼容 Java SE 标准,因此可以方便切换。

    下载

    可以到https://github.com/alibaba/dragonwell8/releases?spm=5176.cndragonwell.0.0.4c5a7568DpYPsp 下载,当前的最新版是8.4.4 GA

    ali jdk8

    阿里也提供了镜像下载地址,可以加速下载:

    8.4.4GA

    File name 中国大陆 United States
    Alibaba_Dragonwell_8.4.4-GA_Linux_x64.tar.gz download download
    Alibaba_Dragonwell_8.4.4-GA_source.tar.gz download download
    Alibaba_Dragonwell_8.4.4-Experimental_Windows_x64.tar.gz download download
    java8-api-8.4.4-javadoc.jar download download
    java8-api-8.4.4-sources.jar download download
    java8-api-8.4.4.jar download download

    SHA256 checksum

    使用

    wget https://dragonwell.oss-cn-shanghai.aliyuncs.com/8/8.4.4-GA/Alibaba_Dragonwell_8.4.4-GA_Linux_x64.tar.gz
    tar zxvf Alibaba_Dragonwell_8.4.4-GA_Linux_x64.tar.gz 
    cd jdk8u262-b10/
     bin/java -version
    

    输出:

    openjdk version "1.8.0_262"
    OpenJDK Runtime Environment (Alibaba Dragonwell 8.4.4) (build 1.8.0_262-b10)
    OpenJDK 64-Bit Server VM (Alibaba Dragonwell 8.4.4) (build 25.262-b10, mixed mode)
    

    容器环境使用

    我们需要准备一个基础镜像包,我们以openjdk:8-jdk-slim为基础包,把jdk替换为dragonwell8

     FROM openjdk:8-jdk-slim
     MAINTAINER jadepeng
     
     RUN sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list 
         && apt-get update
         && apt-get install -y procps unzip curl bash tzdata ttf-dejavu 
         && rm -rf /var/cache/apt/ 
         && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
         && echo "Asia/Shanghai" > /etc/timezone
     
     RUN rm -r -f /usr/local/openjdk-8
     
     ADD jdk8u262-b10  /usr/local/openjdk-8
    

    构建:

    docker build -t dragonwell8:8.4.4 .
    

    java应用就可以用dragonwell8:8.4.4 为底包执行了。

    dragonwell8 协程使用

    dragonwell8的一大特色就是协程(Coroutine )

    官方有一个demo:

    以一个pingpong 1,000,000次的程序为例,这是一个需要阻塞,切换密集型的应用。

               o      .   _______ _______
                  \_ 0     /______//______/|   @_o
                    /\_,  /______//______/     /
                   |     |      ||      |     / |
    
    static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();
    
    public static void main(String[] args) throws Exception {
        BlockingQueue<Byte> q1 = new LinkedBlockingQueue<>(), q2 = new LinkedBlockingQueue<>();
        THREAD_POOL.submit(() -> pingpong(q2, q1)); // thread A
        Future<?> f = THREAD_POOL.submit(() -> pingpong(q1, q2)); // thread B
        q1.put((byte) 1);
        System.out.println(f.get() + " ms");
    }
    
    private static long pingpong(BlockingQueue<Byte> in, BlockingQueue<Byte> out) throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1_000_000; i++) out.put(in.take());
        return System.currentTimeMillis() - start;
    }
    

    运行,查看执行时间:

    $java PingPong
    13212 ms
    
    // 开启Wisp2
    $java -XX:+UseWisp2 -XX:ActiveProcessorCount=1 PingPong
    882 ms
    

    开启Wisp2后整体运行效率提升了近十多倍,只需要启动时增加参数-XX:+UseWisp2即可。不用修改一行代码,即可享受协程带来的优势。

    随后可以通过jstack观察到起来的线程都以协程的方式在运行了。

     - Coroutine [0x7f6d6d60fb20] "Thread-978" #1076 active=1 steal=0 steal_fail=0 preempt=0 park=0/-1
            at java.dyn.CoroutineSupport.unsafeSymmetricYieldTo(CoroutineSupport.java:138)
    --
     - Coroutine [0x7f6d6d60f880] "Thread-912" #1009 active=1 steal=0 steal_fail=0 preempt=0 park=0/-1
            at java.dyn.CoroutineSupport.unsafeSymmetricYieldTo(CoroutineSupport.java:138)
    
    ...
    
    

    可以看到最上方的frame上的方法是协程切换,因为线程调用了sleep,yield出了执行权。

    开启Wisp2后,Java线程不再简单地映射到内核级线程,而是对应到一个协程,JVM在少量内核线上调度大量协程执行,以减少内核的调度开销,提高web服务器的性能。

    在阿里的生产环境,性能指标:

    • 在复杂的业务应用中(tomcat + 大量基于netty的中间件)我们获得了大约10%的性能提升。
    • 在中间件应用(数据库代理,MQ)中我们获得大约20%的性能提升。

    更多Wisp的设计实现与API相关信息,请参考Wisp文档


    作者:Jadepeng
    出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    CRL快速开发框架系列教程二(基于Lambda表达式查询)
    CRL快速开发框架系列教程一(Code First数据表不需再关心)
    非关系型数据库来了,CRL快速开发框架升级到版本4
    CRL快速开发框架开源完全转到Github
    火车订票系统的高并发解决方案
    用wordpress搭建个人博客
    centos/redhat安装mysql
    vue之nextTick全面解析
    微信公众号开发笔记3-sdk接入(nodejs)
    微信公众号开发笔记2(nodejs)
  • 原文地址:https://www.cnblogs.com/xiaoqi/p/dragonwell8-docker.html
Copyright © 2020-2023  润新知