Quarkus: Modernizing applications based on the helloworld example from JBoss EAP Quickstart (continued)

Hello everyone – welcome to the fifth post in our series on Quarkus! (By the way, check out our webinar "This is Quarkus – a Kubernetes-native Java framework". We will show how to get started "from scratch" or migrate existing solutions)

Quarkus: Modernizing applications based on the helloworld example from JBoss EAP Quickstart (continued)

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

Measuring performance is a fundamental aspect of almost any modernization process, and memory usage reports are an important part of performance analysis. Today, we'll look at relevant measurement tools that can quantitatively evaluate the improvements gained from modernizing Java applications.

Details on measuring memory usage can be found in the Quarkus guide titled Measuring Performance—How do we measure memory usage?

Below, we will simply show how to compare memory usage data across three different application types (JBoss EAP, JAR package, and executable), collecting this data in Linux using the pmap and ps utilities.

JBoss EAP

We run an instance of the JBoss EAP application (see "Deploying helloworld" in the previous post) and then check its process ID (PID) using the following command:

$ pgrep -lf jboss
7268 java

Note. The -a option allows you to retrieve the full command line (i.e.: $ pgrep -af jboss).

Now we 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 it looks 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 check the RSS value and see that JBoss EAP consumes about 650 MB of memory.

JAR package

We launch the JAR application (see the section 'Running helloworld packaged in JAR' in the previous post):

$ java -jar ./target/helloworld--runner.jar

We again look up the PID using the pgrep command (this time using the described option -a):

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

We run 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 it looks 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

We again check the RSS and see that the JAR package consumes about 130 MB.

Executable file

We run the native executable (see the section 'Running the native executable helloworld' in the previous post):

$ ./target/helloworld--runner

We again check its PID:

$ pgrep -af helloworld
6948 ./target/helloworld--runner

And then we use the obtained 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
And like this:
$ 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 the RSS and see that the executable file occupies about 20 MB of memory.

Comparing memory consumption

So, we got the following figures for memory usage:

  • JBoss EAP – 650 MB.
  • JAR package – 130 MB.
  • Executable file – 20 MB.

Clearly, the executable file takes up much less memory.

Summarizing posts 4 and 5

In this post and the previous one, we discussed the modernization of Java applications using Quarkus-supported technologies (CDI and Servlet 3), as well as various ways to develop, build, and run such applications. We demonstrated how to collect data on memory usage to assess improvements achieved through such modernization. These articles help in understanding how Quarkus works and its benefits—regardless of whether it's about the simplest helloworld program from our examples or much more complex applications from real life.

We will return in two weeks with the final post about Quarkus—see you then!

In our final post, we will show how to combine AMQ Online and Quarkus to build a modern messaging system based on OpenShift using two new technologies related to message processing. Stay tuned for more. this link.

Source: habr.com

Buy reliable website hosting with DDoS protection, VPS VDS servers 🔥 Buy reliable website hosting with DDoS protection, VPS VDS servers | ProHoster