关于openjdk:Java-宣布解散-AWT2DSwing-和-Sound-组桌面端项目-OpenJFX-未受影响

7 月 14 日,OpenJDK 治理委员会全票批准创立 Client Libraries Group,Phil Race 负责初始负责人,并批准遣散 AWT、2D、Swing 和 Sound 组。新成立的 Client Libraries Group 将持续资助 OpenJFX 和 Lanai 我的项目,但 Harfbuzz、Framebuffer Toolkit 和 XRender Pipeline 我的项目将因失去资助而遣散。 该投票于 6 月 21 日面向 OpenJDK 治理委员会成员发动,心愿可能创立新的工作组 Client Libraries Group,将现有的 AWT、2D、Swing 和 Sound 组合并,同时将这些组遣散。长期不沉闷的 Harfbuzz、Framebuffer Toolkit 和 XRender Pipeline 我的项目因失去资助而遣散。旧有小组的邮件列表、动态网页等将由 Client Libraries Group 新任负责人 Phil Race 进行汇总合并。 据悉,Phil Race 是 2D 和 Sound 组的负责人,同时也是 Lanai 我的项目的负责人。Phil Race 自 1999 年成为 Java 2D graphics 团队成员,对客户端代码奉献了数百项更改。同时,他曾任 JSR 15 (Image I/O Framework) 和 JSR 6 (Unified Printing API) 的 specification lead,在 Java 开发工具包(JDK)17 中负责 JEP 382(新的 macOS Rendering Pipeline)。 ...

July 21, 2021 · 1 min · jiezi

阿里巴巴开源-Dragonwell-JDK-最新版本-811GA-发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。距离 Dragonwell JDK 第一个正式版本 8.0.0-GA 发布已经过去 3 个月了,项目在 Github 上的 stars 继续攀升达到了 1900。今天我们带来了最新版本 8.1.1-GA 的发布,包含了全新的特性和更新。详情见下文。 龙井 8.1.1-GA 的新变化新版本里我们同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新,带来了上游稳定版本的最新安全更新和补丁。 在 8.0.0-GA 发布的时候,我们介绍了 Dragonwell 第三个新特性 ElasticHeap 的一些情况,很多用户已经跃跃欲试了,这次发布我们带来了正式的 feature:G1ElasticHeap。能够在不影响 Java 业务运行的前提下,动态节约 Java 进程物理内存。 另外,我们还发布了用户期待的 Windows 实验版本 Experimental Windows version,使用 Windows 开发的小伙伴们可以更加方便的使用 Dragonwell JDK 进行相应的开发工作。 G1ElasticHeap从 feature 的名字上我们可以看到 ElasticHeap 是基于 G1 GC 开发的,所以想要使用这个功能的小伙伴,需要开启 G1 GC(-XX:+UseG1GC)。在 8.0.0-GA 正式版介绍时,我们介绍了部分技术背景,由于 Java 自动管理内存的特性,整个 Java Heap 的地址空间和物理内存将被 Java 进程占用,即使使用率不高,回收后也并不会归还给操作系统,导致 Java 进程会有较高的常驻内存。 ...

October 17, 2019 · 2 min · jiezi

阿里巴巴资深技术专家雷卷值得开发者关注的-Java-8-后时代的语言特性

首先我们必须承认,Java 8 是一个里程碑式的版本,这个相信大多数Java程序员都认同,其中最知名的是 Streams & Lambda ,这让 Functional Programming 成为可能,让 Java 换发新的活力。这也是即便 Oracle 不在支持 Java 8 的更新,各个云厂商还是积极支持,站点为https://adoptopenjdk.net/,可以让 Java 8 能继续保留非常长的时间。 目前非常多的同学日常开发并没有切换到 Java 8 后续的版本,所以这篇文章,我们打算写一个后 Java 8 时代的特性,主要是偏向于开发的,不涉及 GC , Compiler , Java Module , Platform 等,如果一一解释,估计非常长的文章,当然后续可以写另外文章介绍。下面的这些特性会影响到我们日常的代码编写。 考虑到 Java 13 马上发布,所以版本覆盖从 9 到 13 ,与此同时 Java Release 的方式调整,一些特性是在某一版本引入(preview),后续收到反馈后做了非常多的增强和完善,这里就不一一说明特性是哪个版本的,你可以理解为后Java 8版本后的特性大杂烩。参考资料来源于官方 features 和 pluralsight 上每一个版本的 Java 特性介绍。 var 关键字(局部变量类型推导) Local-Variable Type InferenceJava 支持泛型,但是如果类型非常长,你又不是特别关注,你用 var 关键字就可以啦,可以让你代码非常简洁。Java IDE 都非常好地支持 var,不用担心代码提示等问题。 Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<String, List<Map<String,Object>>>(); Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<>(); Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<String, List<Map<String,Object>>>(); //lambda BiFunction<String, String, String> function1 = (var s1, var s2) -> s1 + s2; System.out.println(function1.apply(text1, text2));复制 confd 文件到 bin 目录下,启动 confd ...

September 9, 2019 · 2 min · jiezi

“龙井”开箱评测 |Alibaba Dragonwell 新手上路指南

作者|阿里云智能事业群 高级技术专家 陆传胜阿里巴巴有着最丰富的 Java 应用场景,覆盖电商,金融,物流等众多领域,是世界上最大的 Java 用户之一。 2019 年 3 月 21 日,阿里巴巴在北京阿里云峰会上正式宣布开源了 Alibaba Dragonwell 8 产品,并建立了 Alibaba Dragonwell 社区来为全球 Java 用户,特别是中文社区的 Java 用户提供长期支持的 JDK 产品。自宣布开源以来,Alibaba Dragonwell 8 受到了国内外 Java 开发者的关注,今天这篇文章就来详解 Alibaba Dragonwell8 的快速安装和使用,同时列出了参与社区建设的几种方式,期望为那些即将安装及使用 Alibaba Dragonwell 8 的开发者提供参考。Alibaba Dragonwell 8 介绍Alibaba Dragonwell 8 是一款免费的 OpenJDK 发行版。它提供长期支持,包括性能增强和安全修复。Alibaba Dragonwell 8 目前支持 X86-64/Linux 平台,在数据中心大规模 Java 应用部署情况下, 可以大幅度提高稳定性、效率以及性能。Alibaba Dragonwell 8 是 OpenJDK 的下游(friendly fork),使用了和 OpenJDK 一样的 licensing。Alibaba Dragonwell 8 与 Java SE 标准兼容,用户可以使用 Alibaba Dragonwell 8 开发和运行 Java 应用程序。此次开源的 Alibaba Dragonwell 8 是阿里巴巴内部 OpenJDK 定制版 AJDK 的开源版本, AJDK 为在线电商,金融,物流做了结合业务场景的优化,运行在超大规模的,100,000+ 服务器的阿里巴巴数据中心。安装 Alibaba Dragonwell 8目前 Alibaba Dragonwell 8 只支持 Linux x86-64 平台,并且提供了二进制的预编译 JDK 包,您可以通过下面的简单两步安装 Alibaba Dragonwell 8。从 Github 上面 Alibaba Dragonwell 8 项目的下载页面下载预编译的二进制 JDK 包。下载页面链接 https://github.com/alibaba/dragonwell8/releases 将下载下来的 tar 包解压到目标安装目录即可。安装完毕后,只需要将应用引用 的 JAVA_HOME 指向 Alibaba Dragonwell 8 的安装目录就可以使用了。我们以Tomcat8.5.39 版本为例,为了让 Tomcat 运行在 Alibaba Dragonwell 8上面,只需要在启动Tomcat时使用如下命令:JAVA_HOME=/path/to/dragonwell8/installation sh tomcat/bin/catalina.sh start为了确认是运行在 Alibaba Dragonwell 8上面,可以进一步通过给 java 命令添加 -showversion 参数来打印 JDK 版本信息加以判断。JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-showversion" sh tomcat/bin/catalina.sh start启动完毕后在 tomcat/logs/catalina.out 文件的开头,可以看到 Alibaba Dragonwell 8 的版本信息使用 Alibaba Dragonwell 8 专有特性在 8.0-preview 这个版本中, Alibaba Dragonwell 8 提供了两个在阿里巴巴的生产环境中进行过广泛验证的特性:JWarmUp 和 Java Flight Recorder。这两个特性都已经在上游 OpenJDK 社区提交了 JEP 或 patch,在上游合并完成之前,我们希望让 Alibaba Dragonwell 8 的用户可以提前使用到这两个特性。JWarmUp 快速预热 Java 应用OpenJDK 使用了 JIT(Just-in-time) 即时编译技术,可以动态的把 Java 字节码编译成高度优化过机器码,提高执行效率,但在编译之前,Java 代码是以相对低效的解释器模式执行的。在应用启动完成后、业务流量刚进来的短时间内,容易出现的状况是大量 Java 方法开始被 JIT 编译,同时业务请求被较慢的解释器模式执行,最终的结果就是系统负载飙高,可能导致很多用户请求超时。为了解决这个问题,之前的很多做法是使用模拟流量来提前预热应用,JWarmUp 特性提供了一个新的选择,就是利用 Java 虚拟机前一次执行编译得记录来预热本次应用的执行。JWarmUp 的原理如下图所示:一个典型的应用场景是当应用需要发布新版本的时候,首先 JWarmUp 在 Beta 环境(或者有着和生产环境类似流量的其他场景)的单台机器上短时间执行 Java 应用,并记录、收集这段时间里面 JIT 编译器所做动作的一些元数据。然后会把这些元数据复制到生产环境的每一台包含了新版本代码的机器/容器里面。最后在生产环境机器中通过 JWarmUp 参数加载 beta 环境生成的元数据,来指导生产环境的机器在启动应用的过程中就完成 JIT 预热。这样当用户请求进入的时候,应用就会处于性能最高的峰值状态。收集预热数据还以 Tomcat 应用为例,可以添加下面的命令行参数来在 beta 环境中收集 JIT 编译时生成的元数据,其中参数 -XX:CompilationWarmUpLogfile= 指定的就是生成的 JWarmUp 文件的路径。JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:ReservedCodeCacheSize=512m -XX:CompilationWarmUpLogfile=$PWD/jwarmup.log -XX:+CompilationWarmUpRecording -XX:+CompilationWarmUp -XX:-TieredCompilation -XX:+DeoptimizeBeforeWarmUp -XX:CompilationWarmUpDeoptTime=30 -XX:+PrintCompilationWarmUpDetail" sh bin/catalina.sh start生成之后可以把这个文件通过 OSS、SFTP 等方式传输到生产环境的机器上。使用记录的数据来预热 Java 应用在生产环境的机器上,只需要使用下面的参数,就可以利用之前的预热数据来启动一个新的 Tomcat 实例,其中参数 -XX:CompilationWarmUpLogfile= 制定的就是需要被加载的 JWarmUp 文件路径,这个文件应该是上一步收集预热数据时从 beta 环境复制过来的。JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:ReservedCodeCacheSize=512m -XX:CompilationWarmUpLogfile=$PWD/jwarmup.log -XX:+CompilationWarmUp -XX:-TieredCompilation -XX:+DeoptimizeBeforeWarmUp -XX:CompilationWarmUpDeoptTime=30 -XX:+PrintCompilationWarmUpDetail" sh bin/catalina.sh start使用 Java Flight Recorder 分析 Java 应用性能JFR(Java Flight Recorder)是 JVM 内置的基于事件的性能分析特性,这是 Oracle JDK7u4 版本开始提供的商业特性,2018 年的时候在 JDK11 上开源了这个特性,但是一直没有针对 JDK8 版本的支持。阿里巴巴和 RedHat、Azul、Amazon 等公司一起合作尝试把这个特性移植回 JDK8上,不过该 patch 暂时还没有合并回 OpenJDK8u仓库,我们在 Alibaba Dragonwell 8 中提供了 Alibaba 移植的 JFR 版本,用于帮助用户提前获取这方面的支持。JFR 的用法很简单,用户使用命令行参数或者 jcmd 命令控制 HotSpot 输出性能数据到文件中,然后就能使用开源的 jmc 工具在图形界面中打开、分析生成的数据文件了。使用 JFR 收集性能数据在 Alibaba Dragonwell 8中,默认情况下 JFR 特性是处于关闭的状态,必须添加命令行参数 -XX:+EnableJFR 来允许使用 JFR 特性。 Alibaba Dragonwell 8 提供了不同的方式来使用 JFR 采集性能数据。应用可以可以通过命令行参数指定 JFR 再启动后立马开始采集数据,这个对于诊断启动阶段的问题会很有帮助。下面的示例命令会在 Java 进程的 JFR 模块初始化后就开始收集 JFR 数据,持续一分钟,并且把数据都输出到名为rec.jfr 的文件中。JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR -XX:StartFlightRecording=duration=1m,filename=rec.jfr" sh bin/catalina.sh start应用也可以只添加 -XX:+EnableJFR ,然后通过 jcmd 命令在应用启动后的任意时间点开始采集数据,这种情况更加灵活可控,可以满足随时随地进行分析的需求。以 Tomcat 为例,启动 Tomcat 的命令可以是:JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR" sh bin/catalina.sh start当需要收集数据进行分析时,只需要使用目标 Tomcat 进程的 PID 来执行 JFR 对应的 jcmd 命令即可。以 Tomcat 为例,如果需要在指定时刻开始收集 10 秒的数据,那么触发的命令如下:$ ps ax | grep tomcat 77522 pts/18 Sl+ 0:08 /home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/../j2sdk-image/bin/java -Djava.util.logging.config.file=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:+EnableJFR -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/bin/bootstrap.jar:/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/bin/tomcat-juli.jar -Dcatalina.base=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39 -Dcatalina.home=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39 -Djava.io.tmpdir=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/temp org.apache.catalina.startup.Bootstrap start 98451 pts/22 S+ 0:00 grep –color=auto tomcat$ dragonwell8_home/bin/jcmd 77522 JFR.start duration=10s filename=$PWD/rec3.jfr77522:Started recording 3. The result will be written to:/home/my/workdir/rec3.jfr10 秒之后可以看到生成了 JFR 数据文件/home/my/workdir/rec3.jfr,使用 JMC 即可进行分析。也可以不指定收集数据的时间,直接启动 JFR 收集,并且在需要的时候手动把所有生成的数据一次性 dump 到文件,$ dragonwell8_home/bin/jcmd 2823 JFR.start filename=$PWD/rec4.jfr2823:Started recording 4. No limit specified, using maxsize=250MB as default.Use JFR.dump name=4 to copy recording data to file.$ dragonwell8_home/bin/jcmd 2823 JFR.dump name=4 filename=rec4.jfr2823:Dumped recording “Recording-4”, 332.7 kB written to:/path/to/my/workdir/rec4.jfr使用 JMC 分析性能JFR 记录 Java 应用性能数据的输出是一个二进制的文件,我们借助于 JMC(Java Mission Control) 工具可以在图形化界面里面分析具体的性能数据。这个工具是开源产品,没有包括在 Alibaba Dragonwell 8里面,需要到 OpenJDK 的官方网站下载使用,https://jdk.java.net/jmc/。请注意, Alibaba Dragonwell8 生成的JFR数据文件需要 7.0 或更高版本的 JMC 工具来分析。打开 JMC 后,可以点击左侧的详细类别来详细分析采样时间段内发生的各种事件。诊断调试支持 Alibaba Dragonwell 8 还内置一些方便的诊断特性,主要包括大对象分配报警可以通过新的 JVM 参数"-XX:ArrayAllocationWarningSize=",比如下面代码中分配了比较大的数组public static void main(String[] args) { doAlloc(32 * 1024 * 1024 + 1);}private static Object doAlloc(int size) { return new byte[size];}执行时如果添加 ArrayAllocationWarningSize 选项就会打印出分配该数组时的 Java 堆栈详细的 ParNew GC 日志支持 Alibaba Dragonwell 8 默认使用了 CMS (Concurrent Mark Sweep) 算法,新生代使用了 ParNew 算法,所以内置两个针对 ParNew GC 日志的增强可以通过 jinfo 工具设置 PrintYoungGenHistoAfterParNewGC 选项来在下一次 Young GC 结束的时候打印新生代的对象类型直方图。命令如下jinfo -flag +PrintYoungGenHistoAfterParNewGC <pid>打印完成后,这个选项会被重置回 false 状态,防止过多的输出,一个典型的输出例子如下:可以通过-XX:+PrintGCRootsTraceTime 来打印处理每一类 GC 根集所花费的详细 CPU 时间,输出示例如下:精简版 HeapDump 支持 Alibaba Dragonwell 8 的 jmap 工具支持一个新的 dump 选项“mini”可以在做 heapdump 的时候跳过所有的原始类型数组的内容,从而大大减小生成的 heapdump 文件大小,这对于只需要排查类型、对象关系的场景会比较有帮助。示例命令如下:本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 9, 2019 · 3 min · jiezi