By Lu Chuansheng, Senior Technical Expert at Alibaba Cloud Intelligence Department
Over the years, Alibaba Group has been involved in several, major, and large-scale Java application scenarios in the fields of e-commerce, finance, and logistics. Alibaba Cloud now wants to share the expertise learned through these large-scale applications of Java with the greater cloud community, and contribute to the greater community.
On March 21, 2019, Alibaba Cloud officially announced its new open-source project of the free distribution version of OpenJDK Alibaba Dragonwell 8. At the summit, Alibaba announced they want to establish the Dragonwell community to provide long-term JDK support for international Java users in addition to their user base in China. After being published as an open-source project, Alibaba Dragonwell 8 has now drawn attention from several Java developers both in China and abroad.
This blog, besides exploring what Dragonwell 8 is, will also look at how you can install and use Alibaba Dragonwell 8 and consider some way in which you can participate in the Alibaba Dragonwell 8 community.
Alibaba Dragonwell 8 is a free distribution version of OpenJDK, which will offer long-term support, including performance enhancements and security fixes, from Alibaba Cloud. Alibaba Dragonwell 8 currently supports the X86-64/Linux platform. The addition of Dragonwell 8 can greatly improve the stability, efficiency, and performance of your large-scale Java application deployments in the data centers. Alibaba Dragonwell 8 is a "friendly fork" under the same licensing terms as the OpenJDK project and is compatible with the Java SE Standard. Users can use Alibaba Dragonwell 8 to develop and run Java applications. The open-source Alibaba Dragonwell 8 is the open-source version of the AJDK, a customized version OpenJDK used internally at Alibaba Group. AJDK is specifically optimized for e-commerce, finance, and logistics based on business scenarios and runs on the ultra large-scale Alibaba data center, housing well over 100,000 servers.
Currently, Alibaba Dragonwell 8 supports Linux x86-64 platform only and provides pre-compiled binary JDK packages. You can follow the two steps to install Alibaba Dragonwell 8.
After the installation is completed, simply point JAVA_HOME referenced by the application to the installation directory of Alibaba Dragonwell 8. Consider Tomcat 8.5.39 for example, to run Tomcat on Alibaba Dragonwell 8, simply use the following command when starting Tomcat:
JAVA_HOME=/path/to/dragonwell8/installation sh tomcat/bin/catalina.sh start
To confirm that Tomcat is actually running on Alibaba Dragonwell 8, you can add the -showversion
parameter to that Java command to print the JDK version information.
JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-showversion" sh tomcat/bin/catalina.sh start
After Tomcat is started, you can see the version information about Alibaba Dragonwell 8 at the beginning of the tomcat/logs/catalina.out
file.
This sections discusses how you can use the various features of Alibaba Cloud Dragonwell 8. Currently, the preview view of Dragonwell 8 provides two features that have been in full production mode at Alibaba Group internally: JWarmUp and Java Flight Recorder. For both the features, JEP or patches have been submitted to the upstream OpenJDK community. Before the upstream merge is completed, we hope that Alibaba Dragonwell 8 users can use the two features in advance.
To improve the execution efficiency, OpenJDK uses the JIT (just-in-time) compilation technology to dynamically compile Java byte code into highly optimized machine code. However, before this compilation is completed, Java code is run in interpreter mode, which is relatively inefficient.
When the application is started and business traffic just comes in, it is very likely that many Java methods begin to be compiled by using JIT and business requests are being executed by slow interpreters. The final result of this phenomenon is the extremely high system load and many user request timeouts. Many previous solutions to this problem is to use simulated traffic to warm up applications. The JWarmUp feature provides a new option for solving this problem, that is, to use the record of the previous execution and compilation of a Java virtual machine to warm up the current application to be run.
The following figure shows how JWarmUp functions.
A typical application scenario of JWarmUp is to release a new application version:
By doing this, the application will show the best performance once a user request is made.
Again, consider Tomcat as an example, the following command line parameter can be added to collect the metadata generated in the beta environment during the JIT compilation, where the -XX:CompilationWarmUpLogfile=
parameter specifies the path of the JWarmUp file generated.
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
Following this, this generated file can be transmitted onto machines in production by using OSS, SFTP or other methods.
On machines in production, you can simply use the following parameters to start a new instance of Tomcat by using the previous warmup data. The -XX:CompilationWarmUpLogfile=
parameter specifies the path of the JWarmUp file to be loaded. This file should be copied from the beta environment in the previous step to collect warmup data.
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
JFR (Java Flight Recorder) is an event-based performance analysis feature built in JVMs. This commercial feature began to be available starting in Oracle JDK7u4. The feature was made open source for JDK11 in 2018. However, support for JDK8 is not available.
Alibaba works together with companies like Red Hat, Azul, and Amazon to add support for this feature to JDK8. However, currently this patch has not been merged to OpenJDK8u. To allow you to obtain the support for this feature in advance, we have provided the JFR version ported by Alibaba in Alibaba Dragonwell 8.
It is extremely easy to use JFR. You only use command-line parameters or jcmd commands to control HotSpot and generate performance data into files. Then you can use the open-source JMC tool to open and analyze the generated files in the graphic interface.
By default, the JFR feature is disabled in Alibaba Dragonwell 8. To enable the JFR feature, the command-line parameter -XX:+EnableJFR
must be added. Alibaba Dragonwell 8 provides several options to collect performance data by using JFR.
A command-line parameter can be used in an application to specify that JFR begins to collect performance data immediately after the application is started. This is helpful for diagnosing startup problems. The following example code will collect JFR data for one minute once the JFR module in the Java process is initialized and return the data into a file named rec.jfr
.
JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR -XX:StartFlightRecording=duration=1m,filename=rec.jfr" sh bin/catalina.sh start
In addition, -XX:+EnableJFR
alone can be added to an application and then jcmd
commands can be used to collect data at any point in time after the application is started.
For example, you can use the following command to start Tomcat:
JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR" sh bin/catalina.sh start
To collect data for analysis, simply use the PID of the destination Tomcat process to run the corresponding jcmd command of JFR. For example, in Tomcat, use the following command to collect data for 10 seconds starting at a specific point in time:
$ 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.jfr
77522:
Started recording 3. The result will be written to:
/home/my/workdir/rec3.jfr
After 10 seconds, the /home/my/workdir/rec3.jfr
JFR file is generated. You can use JMC to analyze that file.
You can also directly start JFR to collect data without specifying the duration of the data collection and manually dump all the data generated into a file at a time when necessary.
$ dragonwell8_home/bin/jcmd 2823 JFR.start filename=$PWD/rec4.jfr
2823:
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.jfr
2823:
Dumped recording "Recording-4", 332.7 kB written to:
/path/to/my/workdir/rec4.jfr
JFR records Java application performance data in a binary file. With JMC (Java Mission Control), we can analyze a specific set of performance data in a graphic interface. JMC is an open-source tool. It is not included in Alibaba Dragonwell 8. To use this tool, you can download it at the OpenJDK official website https://jdk.java.net/jmc/
Note that JMC 7.0 or later is required to analyze JFR data files generated by using Alibaba Dragonwell 8.
After opening JMC, you can click specific items on the left side to analyze events that occurred during the sampling in detail.
Alibaba Dragonwell 8 also has some convenient and built-in diagnosis features discussed below.
The new JVM parameter -XX:ArrayAllocationWarningSize=
can be used for this purpose. For example, the following code assigns a relatively large array.
public static void main(String[] args) {
doAlloc(32 * 1024 * 1024 + 1);
}
private static Object doAlloc(int size) {
return new byte[size];
}
If the ArrayAllocationWarningSize
option is added when the code is run, it will print the Java stack running while this array is assigned.
By default, the CMS (Concurrent Mark Sweep) algorithm is used in Alibaba Dragonwell 8 and the ParNew algorithm is used for the young generation. Therefore, the two built-in enhancements are provided for ParNew GC logs.
PrintYoungGenHistoAfterParNewGC
option by using the jinfo tool so that a object type histogram for the young generation can be printed at the end of the next Young GC. To do this, you can use the following command:jinfo -flag +PrintYoungGenHistoAfterParNewGC <pid>
After this printing operation is completed, the option will be reset back to false to prevent too much output. The following content is a typical output example:
-XX:+PrintGCRootsTraceTime
can be used to print details about CPU time for processing each type of GC root sets. The following content is an output example:The jmap tool in Alibaba Dragonwell 8 supports a new dump option - mini, which allows skipping the content of all arrays of original type when generating HeapDumps. This option significantly reduces the size of generated HeapDump files and is especially helpful in scenarios where it is only required to check types and object relationships.
The following figure shows a code sample.
The Alibaba Dragonwell community provides long-term support for JDK versions. You can obtain support, participate in discussions, and raise your opinions through the following channels:
The Issues page of the Alibaba Dragonwell project on GitHub
[1] Oracle Java 8 official document: https://docs.oracle.com/javase/8/
[2] OpenJDK 8 project homepage: https://openjdk.java.net/projects/jdk8u/
[3] Alibaba Dragonwell 8 project: https://github.com/alibaba/dragonwell8
[4] Alibaba Dragonwell 8 Developer Guide: https://github.com/alibaba/dragonwell8/wiki/Developer-Guide
Advance Deep Learning with Alibaba Open-Source and Pluggable Scheduling Tool for GPU Sharing
508 posts | 48 followers
FollowAlibaba Cloud Native Community - March 25, 2019
Aliware - April 10, 2020
OpenAnolis - September 26, 2022
Aliware - May 20, 2019
Alibaba Cloud Community - April 22, 2024
OpenAnolis - April 20, 2022
508 posts | 48 followers
FollowHigh Performance Computing (HPC) and AI technology helps scientific research institutions to perform viral gene sequencing, conduct new drug research and development, and shorten the research and development cycle.
Learn MoreA HPCaaS cloud platform providing an all-in-one high-performance public computing service
Learn MoreConnect your on-premises render farm to the cloud with Alibaba Cloud Elastic High Performance Computing (E-HPC) power and continue business success in a post-pandemic world
Learn MoreBuild business monitoring capabilities with real time response based on frontend monitoring, application monitoring, and custom business monitoring capabilities
Learn MoreMore Posts by Alibaba Cloud Native Community