XELK-AN-009: Comparing JVMs (Java Virtual Machines) on i.MX6 family processors
Info Box
|
![]() |
This application note has been validated using the kit version in the History table. | ![]() |
Contents
History[edit | edit source]
Version | Date | Development Kit version |
---|---|---|
1.0.0 | Nov 2019 | XELK 4.0.0 , XUELK 2.0.3 |
Introduction[edit | edit source]
Nowadays the Java programming language has been mainly used to develop business server side application.
On the latest years it can be used on embedded devices too, thanks both to the constantly increasing processing power of embedded microprocessors and to the optimization of Java Virtual Machines
Java Virtual Machine[edit | edit source]
There are many different JVM that can run on ARM platform: the JVM let you to run your Java application on an Embedded platform like the DAVE's SBC-AXEL and SBC-Lynx platforms.
In this Application Note, we would like to explore some of the most popular Java Virtual Machines and measure their performances on the embedded platform. The different JVMs performance results let the user to target which JVM can be the best selection for running its Java code.
ZeroVM[edit | edit source]
The ZeroVM JDK version has to be taken into account if used on some JVM: this version - used for example on OpenJDK 8 and AdoptOpenJDK 8 - gives output results really less performing then the others VMs.
It should be considered - infact - that OpenJDK Zero VM is an interpreter only JVM. It's easier to port because it has no architecture specific assembly code but, on the other hand, it's not performant because it has no architecture specific assembly code.
Available Java Virtual Machines[edit | edit source]
There's tons of JVM available in the market, both commercials and free/opensource ones: the JVM listed below have been selected from the main Java players in the market.
Obviously the Oracle JDK is the reference one due to the original Java project started by Sun Microsystems and acquired by Oracle on 2010.
Historically Sun/Oracle provides different flavors of their JVM, depending on the target host (desktop vs server vs embedded.
Oracle Java SE Embedded was the flavor targetting embbedded market, but Oracle announced that Java 8 is the final major Oracle Java SE Embedded Product.
Here the blog announce:
Accordingly, starting with JDK 9, Oracle doesn't plan to offer a separate "Oracle Java SE Embedded" download. In other words, Oracle Java SE 8 Embedded is the final release series of the "Oracle Java SE Embedded" product. New features in JDK 9 obviate the need for it to be a separate product.
For the The Oracle Java License, please find more information on Oracle Java web site.
Newest JVM based on Java 9, 10, 11, 12 and 13 can be found from the OpenJDK JVM players.
Selection of embedded Virtual Machine[edit | edit source]
Here below the list of JVMs compared in the tests and the binary download sites:
Java Virtual Machine | JDK version | VM version | Notes |
---|---|---|---|
Oracle JDK | 8u211 | Java HotSpot(TM) Client VM (build 25.211-b12, mixed mode) | |
OpenJDK (*) | 1.8.0_102 | OpenJDK Zero VM (build 25.102-b14, interpreted mode) | ZeroVM |
AdoptOpenJDK | 1.8.0_232 | OpenJDK Zero VM (AdoptOpenJDK)(build 25.232-b09, interpreted mode) | ZeroVM |
ZuluCommunity | 8u232 | OpenJDK Client VM (Zulu8.42.0.195-CA-linux_aarch32hf) (build 25.232-b195, mixed mode, Evaluation) | |
AdoptOpenJDK | 11.0.5 | OpenJDK Server VM AdoptOpenJDK (build 11.0.5+10, mixed mode) | |
LibericaJDK | 11.0.5-BellSoft | OpenJDK 32-Bit Server VM (build 11.0.5-BellSoft+11, mixed mode) | |
ZuluCommunity | 11.0.4 | OpenJDK Client VM Zulu11.33+21-CA (build 11.0.4+10-LTS, mixed mode) |
(*) We do not provide a download URL for OpenJDK 1.8.x because it has been build with standard recipe provided with DAVE Development Kits
Licensing[edit | edit source]
Each JVM has a proper licensing model and this has to be taken into account:
- Oracle: the Java license agreement should be accomplished in order to use and evaluate it
- OpenJDK, AdoptOpenJDK: GPLv2
- Zulu: see Zulu Community (free download and uses without restrictions, cit)
- BellSoft: Liberica JDK for Embedded (provided with no license restrictions, cit.)
Benchmarks[edit | edit source]
Two standard Java code benchmark tools are used to compare the JVMs:
Licensing[edit | edit source]
We have to comply to the proper license agreements in order to run the benchmarks:
- SciMark: please read the credits page about National Institute of Standards and Technology (NIST) GPL license
- CaffeineMark: according to the Pendragon Software's CaffeineMark™ ver. 3.0
- the test was performed without independent verification by Pendragon Software and that Pendragon Software makes no representations or warranties as to the result of the test
Test results[edit | edit source]
The benchmarks have been run on the same platform and same cpu: the different JVMs was decompressed in the /home/root/java directory of the target and started manually.
XELK[edit | edit source]
The following tests have been performed on SBC-AXEL equipped with:
- DXLM0193 SOM
- i.MX6 Dual Lite processor @ 792MHz
- 1GB DDR
- boot from SD card (u-boot, kernel and root file system)
Java Virtual Machine | SciMark 2.0 (Composite Score) | CaffeineMark 3.0 (Overall score) |
---|---|---|
Oracle JDK 8 | 69.37 | 22673 |
OpenJDK 8 (*) | 3.62 | 605 |
AdoptOpenJDK 8 (*) | 3.44 | 569 |
ZuluCommunity 8 | 69.14 | 17237 |
AdoptOpenJDK 11 | 82.39 | 78111 |
LibericaJDK 11 | 82.55 | 77083 |
ZuluCommunity 11 | 69.61 | 17060 |
(*) The interpreted ZeroVM JVM version explains the very poor performance
XUELK[edit | edit source]
The following tests have been performed on SBC-Lynx equipped with:
- i.MX6 Ultra Lite processor @ 528MHz
- 512MB DDR
- boot from SD card (u-boot, kernel and root file system)
Java Virtual Machine | SciMark 2.0 (Composite Score) | CaffeineMark 3.0 (Overall score) |
---|---|---|
Oracle JDK 8 | 28.75 | 9426 |
OpenJDK 8 (*) | 1.68 | 257 |
AdoptOpenJDK 8 (*) | 1.55 | 243 |
ZuluCommunity 8 | 29.26 | 9482 |
AdoptOpenJDK 11 | 54.23 | 30268 |
LibericaJDK 11 | 54.46 | 27261 |
ZuluCommunity 11 | 29.16 | 9200 |
(*) The interpreted ZeroVM JVM version explains the very poor performance
For a detailed test command usage, please click on the Expand link:
root@sbc-lynx:~/java# ls -la drwxr-xr-x 10 root root 4096 Jan 8 22:29 . drwx------ 4 root root 4096 Jan 8 21:41 .. drwxr-xr-x 10 1000 1000 4096 Jan 8 22:15 adopt-jdk11.0.5 drwxr-xr-x 5 1000 1000 4096 Jan 8 21:45 adopt-jdk8u232 drwxrwxr-x 7 1000 1000 4096 Jan 8 21:55 bellsoft-jdk11.0.5 drwxr-xr-x 3 root root 4096 Jan 8 21:53 benchmark drwxr-xr-x 10 1000 1000 4096 Jan 8 21:52 jdk1.8.0_211 drwxrwxr-x 9 111 122 4096 Jan 8 21:49 zulu-jdk1.8.0_232 drwxrwxr-x 10 111 122 4096 Jan 8 22:01 zulu-jdk11.0.4 root@sbc-lynx:~/java# ls -la benchmark/ drwxr-xr-x 3 root root 4096 Jan 8 21:53 . drwxr-xr-x 10 root root 4096 Jan 8 22:29 .. drwxr-xr-x 2 root root 4096 Jan 8 21:43 Caffeine -rwxr-xr-x 1 root root 34229 Jan 8 21:53 scimark2lib.jar root@sbc-lynx:~/java#
Here below an example of SciMark benchmark started for OracleJDK on i.MX6DL:
root@imx6qxelk:~/java# ./jdk1.8.0_211/bin/java -cp ./benchmark/scimark2lib.jar jnt.scimark2.commandline SciMark 2.0a Composite Score: 69.37463986126829 FFT (1024): 69.63592899407837 SOR (100x100): 123.68132332709474 Monte Carlo : 17.99165245491594 Sparse matmult (N=1000, nz=5000): 50.866191316811516 LU (100x100): 84.69810321344092 java.vendor: Oracle Corporation java.version: 1.8.0_211 os.arch: arm os.name: Linux os.version: 4.9.11-xelk-4.0.0 root@imx6qxelk:~/java#
and the same JVM on the i.MX6UL:
root@sbc-lynx:~/java# ./jdk1.8.0_211/bin/java -cp ./benchmark/scimark2lib.jar jnt.scimark2.commandline SciMark 2.0a Composite Score: 28.752359792101156 FFT (1024): 24.74240503907121 SOR (100x100): 52.136229862882686 Monte Carlo : 7.4006247447847375 Sparse matmult (N=1000, nz=5000): 24.794189606277396 LU (100x100): 34.68834970748977 java.vendor: Oracle Corporation java.version: 1.8.0_211 os.arch: arm os.name: Linux os.version: 4.1.15-xuelk-2.0.3 root@sbc-lynx:~/java#
Then, an example of Caffeine benchmark on i.MX6DL:
root@imx6qxelk:~/java# ./jdk1.8.0_211/bin/java -cp ./benchmark/Caffeine CaffeineMarkEmbeddedApp Sieve score = 12204 (98) Loop score = 46042 (2017) Logic score = 22955 (0 String score = 29983 (708) Float score = 21900 (185) Method score = 16041 (166650) Overall score = 22673 root@imx6qxelk:~/java#
and the same JVM on the i.MX6UL:
root@sbc-lynx:~/java# ./jdk1.8.0_211/bin/java -cp ./benchmark/Caffeine CaffeineMarkEmbeddedApp Sieve score = 6359 (98) Loop score = 14088 (2017) Logic score = 11336 (0) String score = 11944 (708) Float score = 7008 (185) Method score = 8253 (166650) Overall score = 9426 root@sbc-lynx:~/java#
Copyright and Trademark Information[edit | edit source]
Java™ and HotJava™ are trademarks of Sun Microsystems, Inc. and refer to Sun's Java programming language and HotJava browser technologies.
Java™ and OpenJDK™ are trademarks or registered trademarks of Oracle and/or its affiliates.
Zulu Community™ is a trademark and Copyright © of Azul Systems, Inc.
Liberica is a Copyright of © BellSoft LTD
The CaffeineMark™ benchmark is a trademark and Copyright © of Pendragon Software
AdoptOpenJDK is a community of Java User Group (JUG) members, Java developers and vendors including Azul, Amazon, GoDaddy, IBM, jClarity, Microsoft, New Relic, Pivotal and Red Hat.