Quarkus: application upgrades using the helloworld example from JBoss EAP Quickstart (continued)

Hello everyone - this is the fifth post from our series about Quarkus! (By the way, register and go to our webinar “ This is Quarkus - Kubernetes native Java framework ”, which will be held on May 27. We will show how to start from scratch or transfer ready-made solutions)



In a previous post, we examined the modernization of Java applications using the supported Quarkus technologies (CDI and Servlet 3) using the helloworld program from the Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart repository . Today we will continue the topic of modernization and discuss the issue of memory consumption.

Performance measurement is the fundamental foundation of almost any upgrade, and memory usage reports are an important part of the performance analysis process. Today we will look at the relevant measuring tools with which you can quantify the improvements made as a result of the modernization of Java applications.

For more information on measuring memory usage, see the Quarkus manual titled Measuring Performance — How do we measure memory usage?

And below we just show how to compare memory usage data with three different types of applications (JBoss EAP, JAR package and executable), collecting this data on Linux using pmap and ps utilities.

Jboss eap


We launch an instance of the JBoss EAP application (see the “Deploying helloworld” section in the previous post ) and then look at its PID process identifier (in our example, it is 7268) using the following command:

$ pgrep -lf jboss
7268 java

Note. The –a option allows you to extract the complete command line (that is: $ pgrep -af jboss).

Now use PID 7268 in the ps and pmap commands.

Like this:

$ ps -o pid,rss,command -p 7268
PID RSS COMMAND 
7268 665348 java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferI

And like this:

$ pmap -x 7268
7268:   java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standa
Address           Kbytes     RSS   Dirty Mode  Mapping
00000000ae800000 1348608  435704  435704 rw---   [ anon ]
0000000100d00000 1035264       0       0 -----   [ anon ]
000055e4d2c2f000       4       4       0 r---- java
000055e4d2c30000       4       4       0 r-x-- java
000055e4d2c31000       4       0       0 r---- java
000055e4d2c32000       4       4       4 r---- java
000055e4d2c33000       4       4       4 rw--- java
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         3263224  672772  643024

We look at the RSS value and see that JBoss EAP consumes approximately 650 MB of memory.

Jar package


Launch the JAR application (see the section “Launch helloworld packed in the JAR” in the previous post ):

$ java -jar ./target/helloworld-<version>-runner.jar

Again we look at the PID using the pgrep command (this time using the -a option described above):

$ pgrep -af helloworld
6408 java -jar ./target/helloworld-<version>-runner.jar

We start ps and pmap to measure memory usage, but now for process 6408. Like

this:

$ ps -o pid,rss,command -p 6408
  PID   RSS COMMAND
 6408 125732 java -jar ./target/helloworld-quarkus-runner.jar

And like this:

$ pmap -x 6408
6408:   java -jar ./target/helloworld-quarkus-runner.jar
Address           Kbytes     RSS   Dirty Mode  Mapping
00000005d3200000  337408       0       0 rw---   [ anon ]
00000005e7b80000 5046272       0       0 -----   [ anon ]
000000071bb80000  168448   57576   57576 rw---   [ anon ]
0000000726000000 2523136       0       0 -----   [ anon ]
00000007c0000000    2176    2088    2088 rw---   [ anon ]
00000007c0220000 1046400       0       0 -----   [ anon ]
00005645b85d6000       4       4       0 r---- java
00005645b85d7000       4       4       0 r-x-- java
00005645b85d8000       4       0       0 r---- java
00005645b85d9000       4       4       4 r---- java
00005645b85da000       4       4       4 rw--- java
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         12421844  133784  115692

Again, look at the RSS and see that the JAR package consumes approximately 130 MB.

Executable file


We launch the native (see the section “We launch the native helloworld executable file” in the previous post ):

$ ./target/helloworld-<version>-runner

Again, look at his PID:

$ pgrep -af helloworld
6948 ./target/helloworld-<version>-runner

And then use the resulting process identifier (6948) in the ps and pmap commands.

Like this:

$ ps -o pid,rss,command -p 6948
  PID   RSS COMMAND
 6948 19084 ./target/helloworld-quarkus-runner
  :
$ pmap -x 6948
6948:   ./target/helloworld-quarkus-runner
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000      12      12       0 r---- helloworld-quarkus-runner
0000000000403000   10736    8368       0 r-x-- helloworld-quarkus-runner
0000000000e7f000    7812    6144       0 r---- helloworld-quarkus-runner
0000000001620000    2024    1448     308 rw--- helloworld-quarkus-runner
000000000181a000       4       4       4 r---- helloworld-quarkus-runner
000000000181b000      16      16      12 rw--- helloworld-quarkus-runner
0000000001e10000    1740     156     156 rw---   [ anon ]
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         1456800   20592    2684

We look at RSS and see that the executable file occupies about 20 MB of memory.

Compare memory consumption


So, we got the following numbers on memory usage:

  • JBoss EAP - 650 MB.
  • JAR package - 130 MB.
  • The executable file is 20 MB.

Obviously, the executable takes up much less memory.

Summarize 4 and 5 posts


In this and previous posts, we examined the issue of modernizing Java applications using the technologies supported by Quarkus (CDI and Servlet 3), as well as various ways to develop, build and run such applications. We showed how to collect data on memory usage to evaluate the improvements made as a result of such an upgrade. These articles help to understand how Quarkus works and what its benefits are - regardless of whether we are talking about the simplest helloworld program from our examples or about much more complex applications from real life.

We will be back in two weeks with a final post about Quarkus - see you soon!

All Articles