The Volano Report

The tests presented in this report look at the performance and network scalability of 16 Java virtual machines on 7 operating systems using a common Intel hardware platform running VolanoMark™ 2.1. VolanoMark attempts to answer two questions about Java virtual machines used in network server environments -- especially those environments involving a large number of dedicated socket connections:

  1. Is it fast?
  2. Does it scale?

When run at high connection counts, VolanoMark essentially measures the consequences of omitting non-blocking read and write operations from the Java platform, as summarized by this Java Developer Connection request for enhancement (free registration required):

Note that I have been unsuccessful running VolanoMark on the following Java platforms:

For background information and download locations, please see the Java Benchmarks page on Volano's Web site. See the Environments section for details on the hardware platform, operating systems, and Java virtual machine environments, along with a table showing the compiler and threading model of each Java platform.

Reality check

Volano has been testing Java virtual machines for over three years both in our lab with the VolanoMark benchmark and live on the Internet with our VolanoChat server. We have found that performance is no longer the limiting factor in pure Java network server applications running on relatively new hardware. Other factors limit the capacity and throughput of the server long before the processor usage reaches 100 percent -- factors such as the stability of the platform, the memory requirements, and architectural limits on the number of sockets and threads per server process. The results of our attempts to test those limits are shown in Figure 2 and Table 2 below.

Based on our experience and these test results, we recommend the following Java platforms for running a pure Java server application:

Is it fast?

Run rules

The performance test was executed with the following commands on a local loop-back connection, using the heap size options shown below where possible:

Server
java -ms8m -mx64m COM.volano.Main
Client
java -ms8m -mx64m COM.volano.Mark -count 100
See the COM.volano.Mark command synopsis for a complete description of all options.

The operating system was rebooted before each set of tests for a particular Java virtual machine. The server side was not restarted before each run of the client benchmark. The client benchmark ran four times, with the final score as the average of the last three results.

Results

Scores are the throughput of the server in messages per second. Bigger numbers are faster. See the Environments section for details on the hardware platform, operating systems, and Java virtual machine environments.

Java Platform Score
Tower TowerJ 3.1.4 Linux
IBM JDK 1.1.8 Windows NT
IBM JDK 1.1.8 OS/2
Microsoft VM 3229 Windows 2000
IBM JDK 1.1.8 Linux
Sun HotSpot 1.0.1 Windows NT
Sun JDK 1.3 Beta Windows NT
Sun JDK 1.2.2 Windows NT
Microsoft VM 3186 Windows NT
Sun JDK 1.2.1_04 Solaris
Novell JDK 1.1.7 NetWare
Sun JDK 1.2.1_03 Solaris
Sun JDK 1.2 Linux
Transvirtual Kaffe 1.0b4 Linux
Blackdown JDK 1.1.7 Linux
JDK 1.1.8 FreeBSD
2309 2309
2279 2279
2136 2136
1970 1970
1770 1770
1601 1601
1550 1550
1485 1485
1478 1478
1358 1358
1229 1229
1051 1051
915 915
389 389
285 285
173 173
Figure 1. VolanoMark 2.1.2 local performance test, measuring throughput in messages per second.

Java Platform Operating System Results Score
Tower TowerJ 3.1.4 Linuxa Red Hat Linux 6.0 Intel 2303, 2313, 2313, 2300 2309
IBM JDK 1.1.8 Windows NT Windows NT Workstation 4.0 2282, 2276, 2280, 2282 2279
IBM JDK 1.1.8 OS/2 OS/2 Warp Server for e-business 2145, 2141, 2118, 2150 2136
Microsoft VM 3229 Windows 2000 Windows 2000 Server Release Candidate 2 1948, 1965, 1976, 1968 1970
IBM JDK 1.1.8 Linux Red Hat Linux 6.0 Intel 1242, 1772, 1787, 1750 1770
Sun HotSpot 1.0.1 Windows NT Windows NT Workstation 4.0 1558, 1611, 1604, 1589 1601
Sun JDK 1.3 Beta Windows NT Windows NT Workstation 4.0 1538, 1550, 1556, 1545 1550
Sun JDK 1.2.2 Windows NT Windows NT Workstation 4.0 1496, 1481, 1489, 1485 1485
Microsoft VM 3186 Windows NT Windows NT Workstation 4.0 1469, 1484, 1478, 1473 1478
Sun JDK 1.2.1_04 Solaris Solaris 7 Desktop Intel Platform Edition 1371, 1344, 1374, 1355 1358
Novell JDK 1.1.7 NetWareb NetWare 5 1227, 1232, 1229, 1226 1229
Sun JDK 1.2.1_03 Solaris Solaris 7 Desktop Intel Platform Edition 1118, 1055, 1050, 1049 1051
Sun JDK 1.2 Linux Red Hat Linux 6.0 Intel 915, 914, 912, 919 915
Transvirtual Kaffe 1.0b4 Linuxc Red Hat Linux 6.0 Intel 397, 391, 390, 386 389
Blackdown JDK 1.1.7 Linux Red Hat Linux 6.0 Intel 284, 285, 286, 283 285
JDK 1.1.8 FreeBSD FreeBSD 3.2-RELEASE 169, 173, 173, 172 173
Table 1. VolanoMark 2.1.2 local performance test, measuring throughput in messages per second. The final score is the average of the last three results. All tests ran identical copies of VolanoMark 2.1.2 on identical hardware.

Notes:

  1. TowerJ is the only Java platform listed here which is not available for free.
  2. Received "java.net.SocketException: Software caused connection abort" once and "java.net.SocketException: Socket closed" 42 times when the server side was killed on NetWare.
  3. The Kaffe OpenVM is the only Java platform listed here which is still unable to run our VolanoChat product due to Kaffe Bug io/78, "java.io.StreamCorruptedException".

Does it scale?

Run rules

The network scalability test was executed with the following commands over an isolated 10-Mbps Ethernet connection, using the heap and stack size options shown below where possible:

Server
java -ms8m -mx128m -ss32k COM.volano.Main
Client
java -ms8m -mx128m -ss32k COM.volano.Mark -host xxx.yyy.zzz -rooms 50
java -ms8m -mx128m -ss32k COM.volano.Mark -host xxx.yyy.zzz -rooms 100
java -ms8m -mx128m -ss32k COM.volano.Mark -host xxx.yyy.zzz -rooms 150
java -ms8m -mx128m -ss32k COM.volano.Mark -host xxx.yyy.zzz -rooms 200

See the COM.volano.Mark command synopsis for a complete description of all options.

The client test driver was executed under the Sun JDK 1.2.1_03 Production Release for Solaris using Solaris 7 on a dual 200-MHz Sun UltraSPARC with 256 megabytes of RAM. The operating systems on both sides were rebooted before each set of tests for a particular Java virtual machine. The VolanoMark server was not restarted between client test runs.

Results

Scores are the throughput of the server in messages per second based on the total number of concurrent connections. Bigger numbers are faster. See the Environments section for details on the hardware platform, operating systems, and Java virtual machine environments.

2486 2623 1521 1408 1474 1468 1875 1575 1794 612 165 37 1357 1826 708 856 770 1040 1058 739 1081 406 523 659 613 421 354
1000 2000 3000 4000
Tower TowerJ 3.1.4 Linux
IBM JDK 1.1.8 Windows NT
IBM JDK 1.1.8 OS/2
Microsoft VM 3229 Windows 2000
IBM JDK 1.1.8 Linux
Sun HotSpot 1.0.1 Windows NT
Sun JDK 1.3 Beta Windows NT
Sun JDK 1.2.2 Windows NT
Microsoft VM 3186 Windows NT
Sun JDK 1.2.1_04 Solaris
Novell JDK 1.1.7 NetWare
Sun JDK 1.2.1_03 Solaris
Sun JDK 1.2 Linux
Transvirtual Kaffe 1.0b4 Linux
Blackdown JDK 1.1.7 Linux
JDK 1.1.8 FreeBSD
Figure 2. VolanoMark 2.1.2 network scalability test, measuring throughput in messages per second based on the number of concurrent connections.

Java Platform 1000 2000 3000 4000 Notes
Tower TowerJ 3.1.4 Linux 2486 1357 739 421 No errors!
IBM JDK 1.1.8 Windows NT 2623 1826 1081 ---- "java.net.SocketException: Socket read failed: 10107" at 3553/4000 connections.
IBM JDK 1.1.8 OS/2 1521 ---- ---- ---- "java.lang.OutOfMemoryError" at 1098/2000 connections.
Microsoft VM 3229 Windows 2000 1408 708 406 ---- "java.lang.OutOfMemoryError" at 3785/4000 connections.
IBM JDK 1.1.8 Linux ---- ---- ---- ---- Process hangs in hard run at 500/1000 connections and dumps core when killed.
Sun HotSpot 1.0.1 Windows NT ---- ---- ---- ---- "java.lang.OutOfMemoryError" at 902/1000 connections.
Sun JDK 1.3 Beta Windows NT 1474 856 523 ---- "java.lang.OutOfMemoryError" at 3272/4000 connections.
Sun JDK 1.2.2 Windows NT ---- ---- ---- ---- "java.lang.OutOfMemoryError" at 926/1000 connections.
Microsoft VM 3186 Windows NT 1468 770 ---- ---- "java.net.SocketException: No available buffer space" on 3000-connection test.
Sun JDK 1.2.1_04 Solaris 1875 1040 659 ---- "Bus error - core dumped" on 4000-connection test.
Novell JDK 1.1.7 NetWare 1575 ---- ---- ---- Process hangs with disk thrashing at 1960/2000 connections.
Sun JDK 1.2.1_03 Solaris 1794 1058 613 354 No errors!
Sun JDK 1.2 Linux ---- ---- ---- ---- Tests fail with "java.net.SocketException: Interrupted system call".
Transvirtual Kaffe 1.0b4 Linux 612 ---- ---- ---- Dumps core at just over 1000 connections.
Blackdown JDK 1.1.7 Linux 165 ---- ---- ---- Dumps core at just over 1000 connections.
JDK 1.1.8 FreeBSD 37 ---- ---- ---- Client begins failing at 1017 connections with "java.net.NoRouteToHostException: Connection timed out".
Table 2. VolanoMark 2.1.2 network scalability test, measuring throughput in messages per second based on the number of concurrent connections. All tests ran identical copies of VolanoMark 2.1.2 on identical hardware.

Environments

All tests ran identical copies of VolanoMark 2.1.2 on identical hardware -- a 200-MHz Intel Pentium Pro processor with a 256-kilobyte L2 cache and 256 megabytes of RAM on an Intel VS440FX motherboard running American Megatrends AMIBIOS Version 1.00.18.CS1 dated "08/28/98-13:59". The network card is a 3Com Etherlink III PCI Bus-Master Adapter Model 3C590.

Tower TowerJ 3.1.4 Linux
  • Tower Technology TowerJ High Performance Java Compiler Version 3.1.4.0
  • Red Hat Linux Intel 6.0 (Linux 2.2.5-15, glibc 2.1.1-6)
  • TowerJ Compiler "version 3.1.4.0 x86-linux"
  • Installed from TowerJ_3_1_4_0_x86_linux.class (12,913,370 bytes).
  • Uses user-level threads and static native pre-compilation.
  • Used the command line option -Dtowerj.poll for the network scalability test.
  • Built executable with TowerJ project files Main.tj and Mark.tj.
  • Increased the per-process file descriptor limit to 4096 (from 1024) and the system-wide file descriptor limit to 8192 (from 4096). Increased the maximum tasks per user to 4090 (from 256) and the system-wide task limit to 4090 (from 512). Compiled the Linux kernel for the "PPro/6x86MX" processor family.
IBM JDK 1.1.8 Windows NT
  • IBM Developer Kit and Runtime Environment for Windows, Java Technology Edition, Version 1.1.8
  • Microsoft Windows NT Workstation Version 4.0 (Build 1381: Service Pack 5)
  • Java version "JDK 1.1.8 IBM build n118p-19990728 (JIT enabled: ibmjitc V3.5-IBMJDK1.1-19990728)"
  • Installed from ibm-jdk-n118p-win32-x86.zip (10,810,316 bytes).
  • Uses native threads and ibmjitc just-in-time compiler.
IBM JDK 1.1.8 OS/2
  • IBM OS/2 Warp Developer Kit, Java Technology Edition, Version 1.1.8
  • IBM OS/2 Warp Server for e-business (Version 20.45, Internal revision 14.039F_UNI)
  • Java version "JDK 1.1.8 IBM build o118-19990728 (JIT enabled: javax V3.5-IBMJDK1.1-19990728)"
  • Installed from javainuf.exe (20,805,936 bytes) and javaintk.exe (15,273,452 bytes).
  • Uses native threads and javax just-in-time compiler.
  • Modified the CONFIG.SYS file to increase the thread limit from 1024 to 4095 (THREADS=4095) and the initial swap file size from 2 MB to 32 MB (SWAPPATH=C:\OS2\SYSTEM 2048 32768).
Microsoft VM 3229 Windows 2000
  • Microsoft Virtual Machine Build 3229
  • Microsoft Windows 2000 Server Release Candidate 2 (Version 5.0.2128)
  • Java version "1.1.4"
  • jview version 5.00.3229
  • Uses native threads and just-in-time compiler.
  • Heap and stack command line options are not available.
IBM JDK 1.1.8 Linux
  • IBM Developer Kit for Linux, Java Technology Edition, alphaVersion 1.1.8
  • Red Hat Linux Intel 6.0 (Linux 2.2.5-15, glibc 2.1.1-6)
  • Java version "JDK 1.1.8 IBM build l118-19990915 (JIT enabled: jitc)"
  • Installed from ibm-jdk-l118-linux-x86.tgz (10,471,107 bytes).
  • Uses native threads and jitc just-in-time compiler.
  • Increased the per-process file descriptor limit to 4096 (from 1024) and the system-wide file descriptor limit to 8192 (from 4096). Increased the maximum tasks per user to 4090 (from 256) and the system-wide task limit to 4090 (from 512). Compiled the Linux kernel for the "PPro/6x86MX" processor family.
Sun HotSpot 1.0.1 Windows NT
  • Sun Java HotSpot Performance Engine 1.0.1
  • Microsoft Windows NT Workstation Version 4.0 (Build 1381: Service Pack 5)
  • Sun JDK 1.2.2 base with HotSpot VM (1.0.1, mixed mode, build g).
  • Installed from hotspot1_0_1-win.zip (1,256,720 bytes).
  • Uses native threads and an adaptive compiler.
  • The heap options must be preceded by the capital letter "X", and the stack options are not available.
Sun JDK 1.3 Beta Windows NT
  • Sun Java 2 Software Development Kit, Standard Edition, v.1.3 Beta
  • Microsoft Windows NT Workstation Version 4.0 (Build 1381: Service Pack 5)
  • Java version "1.3beta, Java(TM) 2 Runtime Environment, Standard Edition (build 1.3beta-0), Java(TM) HotSpot Client VM (build 1.3beta-0, mixed mode)"
  • Installed from jdk1_3beta-win.exe (25,662,367 bytes).
  • Uses native threads and an adaptive compiler.
  • The heap options must be preceded by the capital letter "X", and the stack options are not available.
Sun JDK 1.2.2 Windows NT
  • Sun Java 2 SDK v1.2.2 Windows 95/98/NT Production Release
  • Microsoft Windows NT Workstation Version 4.0 (Build 1381: Service Pack 5)
  • Java version "Classic VM (build JDK-1.2.2-W, native threads, symcjit)"
  • Installed from jdk1_2_2-win.exe (20,422,291 bytes).
  • Uses native threads and the symcjit Symantec Just-in-Time compiler.
  • The heap options must be preceded by the capital letter "X", and the stack options are not available.
Microsoft VM 3186 Windows NT
  • Microsoft Virtual Machine Build 3186
  • Microsoft Windows NT Workstation Version 4.0 (Build 1381: Service Pack 5)
  • Java version "1.1.4"
  • jview version 5.00.3186
  • Installed from msjavx86.exe (6,632,392 bytes).
  • Uses native threads and just-in-time compiler.
  • Heap and stack command line options are not available.
Sun JDK 1.2.1_04 Solaris
  • Sun Java 2 SDK Solaris Production Pre-Release
  • Sun Solaris 7 Desktop Intel Platform Edition with Maintenance Update 1 and patches 106981-05, 107079-10, 107608-01, and 107637-01.
  • Java version "Solaris_JDK_1.2.1_04_pre-release"
  • Installed from Solaris_JDK_1.2.1_04_pre-release_i386.bin (18,607,361 bytes).
  • Uses native threads and sunwjit just-in-time compiler.
  • The heap and stack options must be preceded by the capital letter "X".
  • Increased the per-process file descriptor limit to 8192 by setting the rlim_fd_max variable in /etc/system.
Novell JDK 1.1.7 NetWare
  • Novell JVM for NetWare
  • Novell NetWare 5 Support Pack 2 Version 5.00c dated April 23, 1999
  • Java version "1.1.7 B"
  • Installed from jvm.exe (18,015,477 bytes).
  • Uses native threads and symcjit just-in-time compiler (Symantec Java! JustInTime Compiler Version 3.10.106(x) for JDK 1.1.x).
  • Set Maximum Packet Receive Buffers = 1000 (from default of 500).
  • Modified the java.cfg file to enable the just-in-time compiler (JAVA_COMPILER=symcjit).
Sun JDK 1.2.1_03 Solaris
  • Sun Java 2 SDK Solaris Production Release
  • Sun Solaris 7 Desktop Intel Platform Edition with patches 106981-04 and 107079-08.
  • Java version "Solaris_JDK_1.2.1_03"
  • Installed from 1.2.1_03_jdk_i386.tar.Z (26,264,747 bytes).
  • Uses native threads and sunwjit just-in-time compiler.
  • The heap and stack options must be preceded by the capital letter "X".
  • Increased the per-process file descriptor limit to 8192 by setting the rlim_fd_max variable in /etc/system.
Sun JDK 1.2 Linux
  • Sun and Blackdown Java-Linux port of the Java 2 SDK to Linux
  • Red Hat Linux Intel 6.0 (Linux 2.2.5-15, glibc 2.1.1-6)
  • Java version "Classic VM (build Linux_JDK_1.2_pre-release-v2, green threads, sunwjit)"
  • Installed from jdk1.2pre-v2.tar.bz2 (19,572,002 bytes).
  • Uses green threads and sunwjit just-in-time compiler.
  • Used the "-green" option to avoid the native thread support which was unable to execute any of the tests.
  • The heap and stack options must be preceded by the capital letter "X", and the "-Xss" stack size option is not available.
  • Increased the per-process file descriptor limit to 4096 (from 1024) and the system-wide file descriptor limit to 8192 (from 4096). Increased the maximum tasks per user to 4090 (from 256) and the system-wide task limit to 4090 (from 512). Compiled the Linux kernel for the "PPro/6x86MX" processor family.
Transvirtual Kaffe 1.0b4 Linux
  • Transvirtual Technologies Kaffe OpenVM Desktop Edition 1.0 Beta 4
  • Red Hat Linux Intel 6.0 (Linux 2.2.5-15, glibc 2.1.1-6)
  • Kaffe Virtual Machine "Engine: Just-in-time Version: 1.0b4 Java Version: 1.1"
  • Installed from the kaffe-1.0.b4-2 package shipped with Red Hat Linux 6.0.
  • Uses jthreads user-level threads and kaffe.jit just-in-time compiler.
  • Increased the per-process file descriptor limit to 4096 (from 1024) and the system-wide file descriptor limit to 8192 (from 4096). Increased the maximum tasks per user to 4090 (from 256) and the system-wide task limit to 4090 (from 512). Compiled the Linux kernel for the "PPro/6x86MX" processor family.
Blackdown JDK 1.1.7 Linux
  • Blackdown Java-Linux port of JDK 1.1.7
  • Red Hat Linux Intel 6.0 (Linux 2.2.5-15, glibc 2.1.1-6)
  • Java version "Linux_JDK_1.1.7B_v3_green_threads"
  • Installed from jdk_1.1.7-v3-glibc-x86.tar.bz2 (10,130,082 bytes).
  • Uses user-level threads and no just-in-time compiler.
  • Increased the per-process file descriptor limit to 4096 (from 1024) and the system-wide file descriptor limit to 8192 (from 4096). Increased the maximum tasks per user to 4090 (from 256) and the system-wide task limit to 4090 (from 512). Compiled the Linux kernel for the "PPro/6x86MX" processor family.
JDK 1.1.8 FreeBSD
  • JDK 1.1.8 for FreeBSD
  • FreeBSD 3.2-RELEASE
  • Java version "jdk1.1.8-FreeBSD:1999/7/19"
  • Installed from jdk1.1.8_ELF.V99-7-19.tar.gz (11,337,773 bytes).
  • Uses user-level threads and no just-in-time compiler.
  • Increased the per-process file descriptor limit to 4096 (from 1064) and the system-wide file descriptor limit to 8192 (from 1064) by using sysctl to modify the kern.maxfilesperproc and kern.maxfiles variables in /etc/rc.local.

Java Platform Operating System Compiler Thread Model
Tower TowerJ 3.1.4 Linux Red Hat Linux 6.0 Intel static many-to-one
IBM JDK 1.1.8 Windows NT Windows NT Workstation 4.0 mixed mode one-to-one
IBM JDK 1.1.8 OS/2 OS/2 Warp Server for e-business mixed mode one-to-one
Microsoft VM 3229 Windows 2000 Windows 2000 Server Release Candidate 2 JIT one-to-one
IBM JDK 1.1.8 Linux Red Hat Linux 6.0 Intel JIT one-to-one
Sun HotSpot 1.0.1 Windows NT Windows NT Workstation 4.0 mixed mode one-to-one
Sun JDK 1.3 Beta Windows NT Windows NT Workstation 4.0 mixed mode one-to-one
Sun JDK 1.2.2 Windows NT Windows NT Workstation 4.0 JIT one-to-one
Microsoft VM 3186 Windows NT Windows NT Workstation 4.0 JIT one-to-one
Sun JDK 1.2.1_04 Solaris Solaris 7 Desktop Intel Platform Edition JIT many-to-many
Novell JDK 1.1.7 NetWare NetWare 5 JIT many-to-one
Sun JDK 1.2.1_03 Solaris Solaris 7 Desktop Intel Platform Edition JIT many-to-many
Sun JDK 1.2 Linux Red Hat Linux 6.0 Intel JIT one-to-one or many-to-one
Transvirtual Kaffe 1.0b4 Linux Red Hat Linux 6.0 Intel JIT many-to-one
Blackdown JDK 1.1.7 Linux Red Hat Linux 6.0 Intel none many-to-one
JDK 1.1.8 FreeBSD FreeBSD 3.2-RELEASE none many-to-one
Table 3. The compiler and threading model used by each Java platform.

Compiler

static
A static compiler which takes Java source files or class files and translates them into a native executable or shared library before they run.
mixed mode
A Java VM which translates some of the Java bytecodes into native instructions on the fly while the Java program runs, while letting a Java interpreter handle the other parts of the program.
JIT
A Java VM which translates the Java bytecodes into native instructions on the fly before executing them.
none
A Java VM which uses a normal Java bytecode interpreter.

Thread Model

one-to-one
Each Java thread is mapped one-to-one onto its own operating system thread.
many-to-one
All of the Java threads in the process are mapped onto one operating system process.
many-to-many
More than one Java thread is mapped to one operating system thread, and a Java thread may be mapped to different operating system threads during its lifetime.

Valid HTML 4.0! Valid CSS! Copyright © 1999-2001 Volano LLC. All rights reserved.
Contact John Neffenger with questions or comments.

This site contains articles by John Neffenger about the Java™ platform, the VOLANO® chat server benchmark (VolanoMark), and the business of developing and publishing software. More…

John Neffenger <john@status6.com>
More…

A PROJECT OF STATUS:6®