Partner – Microsoft – NPI EA (cat = Baeldung)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Microsoft – NPI EA (cat= Spring Boot)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, you can get started over on the documentation page.

And, you can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Orkes – NPI EA (cat=Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag=Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – MongoDB – NPI EA (tag=MongoDB)
announcement - icon

Traditional keyword-based search methods rely on exact word matches, often leading to irrelevant results depending on the user's phrasing.

By comparison, using a vector store allows us to represent the data as vector embeddings, based on meaningful relationships. We can then compare the meaning of the user’s query to the stored content, and retrieve more relevant, context-aware results.

Explore how to build an intelligent chatbot using MongoDB Atlas, Langchain4j and Spring Boot:

>> Building an AI Chatbot in Java With Langchain4j and MongoDB Atlas

Partner – LambdaTest – NPI EA (cat=Testing)
announcement - icon

Accessibility testing is a crucial aspect to ensure that your application is usable for everyone and meets accessibility standards that are required in many countries.

By automating these tests, teams can quickly detect issues related to screen reader compatibility, keyboard navigation, color contrast, and other aspects that could pose a barrier to using the software effectively for people with disabilities.

Learn how to automate accessibility testing with Selenium and the LambdaTest cloud-based testing platform that lets developers and testers perform accessibility automation on over 3000+ real environments:

Automated Accessibility Testing With Selenium

1. Overview

OpenJ9 is a high-performance, scalable, and flexible Java Virtual Machine. We can use it as a replacement for HotSpot in many Java applications. IBM originally developed it as part of its commercial JDK. Now this JVM is supported by the Eclipse Foundation.

We use OpenJ9 to reduce memory footprint and startup time, especially in cloud and container environments. It supports the Java SE specification and works well with OpenJDK.  In this article, we’ll explore how to install OpenJ9 JVM and review its main features.

2. Installation

We can install OpenJ9 by downloading a prebuilt OpenJDK binary that includes it. Many distributions, like Eclipse Temurin, offer builds with OpenJ9. The official release list is on the Eclipse OpenJ9 website.

After downloading the archive, we extract the files and set the JAVA_HOME environment variable.

2.1. Windows

First, we extract the ZIP archive to a preferred location, such as path-to-jdk\jdk-openj9. Then we set the JAVA_HOME environment variable and modify the PATH environment variable:

$ setx JAVA_HOME "path-to-jdk\jdk-openj9" 
$ setx PATH "%JAVA_HOME%\bin;%PATH%"

Finally, we verify the installation:

$ java -version

2.2. Linux

First, let’s extract the archive:

$ tar -xzf OpenJ9-JDK.tar.gz -C /opt

Then we set JAVA_HOME and update the PATH:

$ export JAVA_HOME=/opt/jdk-openj9 
$ export PATH=$JAVA_HOME/bin:$PATH

We can add these lines to .bashrc, or .zshrc to make them permanent. Finally, we check the installation:

$ java -version

Now we’re ready to use OpenJ9 for running and developing Java applications.

3. Garbage Collection Policies

OpenJ9 offers multiple garbage collection policies. Each policy is optimized for different workloads. We can choose the policy that fits our performance goals.

In the HotSpot JVM, we configure garbage collection by selecting a GC implementation and tuning many parameters. In OpenJ9, we use GC policies instead. Each policy is designed for a specific use case, and we choose one at startup using the virtual machine option:

-Xgcpolicy:<name>

Let’s look at the available GC policies in OpenJ9.

3.1. Generational Concurrent GC Policy

This is the default policy and we’ll use it for most applications. Using this GC policy, we split the heap into two areas: nursery and tenure. This policy manages two generation groups: new and older.

It performs global GC using concurrent mark-sweep, optionally followed by compaction. Partial GC is a stop-the-world scavenge or concurrent scavenge.

We enable it with the following flag:

-Xgcpolicy:gencon

3.2. Balanced Policy

We use this policy for large heaps and many threads when we face unacceptable pause times with gencon. This policy divides the heap into equal-sized regions and obtains the support of multiple generations.

Global GC uses incremental concurrent marking. Partial GC uses a stop-the-world and optional mark, sweep, or compaction.

We can add this policy using the flag:

-Xgcpolicy:balanced

3.3. Optimize for Pause Time Policy

We choose this policy to minimize pause times. For example, it may be useful when we have a large heap size and it affects the length of the GC pause. This policy uses a single, flat heap area. Here we have only one generation.

GC is concurrent mark-sweep with optional compaction.

To start using this policy we have to add the following flag:

-Xgcpolicy:optavgpause

3.4. Optimize for Throughput Policy

We select this policy when we want maximum throughput in short-lived applications. We have a flat heap area here. This policy supports one generation.

GC is a stop-the-world mark-sweep with optional compaction.

We can enable this policy using the following flag:

-Xgcpolicy:optthruput

3.5. Metronome Policy

We use this policy for real-time and soft real-time applications. It splits the heap into size-classed regions. Here we have the support of one generation.

The metronome GC runs in short interruptible bursts to avoid long stop-the-world pauses.

To use the metronome policy, we can turn on the flag:

-Xgcpolicy:metronome

3.6. nogc Policy

We use this policy for testing or special use cases where memory isn’t reclaimed. We have a flat heap here. No GC is performed.

We can enable it using the following flag:

-Xgcpolicy:nogc

4. Class Data Sharing and AOT Compilation

OpenJ9 supports Class Data Sharing and Ahead-of-Time compilation out of the box. We can use these features to improve startup time and reduce memory usage.

4.1. Class Data Sharing

Class Data Sharing allows us to cache class metadata in a shared memory cache. We create a shared class cache once and reuse it across JVM runs. This speeds up class loading and reduces memory footprint, especially in container and microservice environments.

To enable CDS, we start the JVM with the following flag:

-Xshareclasses

We can also name the cache and control its size:

-Xshareclasses:name=myCache,cacheDir=/path/to/cache,cacheSize=100M

To view cache statistics, we use:

-Xshareclasses:cacheStats

4.2. Ahead-of-Time Compilation

Ahead-of-time compilation in OpenJ9 compiles Java bytecode into native code before runtime. This reduces JIT warm-up time and improves performance on startup.

Unlike HotSpot, which requires GraalVM for AOT, OpenJ9 has built-in support.  The VM automatically chooses which methods should be AOT-compiled based, but we can disable it using the following flag:

-Xnoaot

5. Diagnostic Data and Tooling

OpenJ9 supports JMX, just like HotSpot. We can connect existing monitoring tools to it.

Additionally, OpenJ9 provides other tools that we can use to troubleshoot performance issues, crashes, or memory problems. We can use dump agents to generate heap dumps, system dumps, and general JVM  information dumps.

To monitor CPU, memory, GC, and thread activity in real time, we could utilize the IBM Health Center.

6. Conclusion

In this tutorial, we saw how OpenJ9 can be a great choice when we want to reduce memory usage and speed up startup time. It works well for cloud workloads, microservices, and containerized apps. However, before using OpenJ9 in production, we should test it with our specific workload.

The same advice applies to GC policy selection. Each policy targets a different use case. We need to measure and compare to choose the best one.

With the right setup, OpenJ9 can deliver solid performance and save resources.

Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

Partner – Microsoft – NPI EA (cat = Baeldung)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Microsoft – NPI EA (cat = Spring Boot)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Orkes – NPI EA (cat = Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag = Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Partner – MongoDB – NPI EA (tag=MongoDB)
announcement - icon

Traditional keyword-based search methods rely on exact word matches, often leading to irrelevant results depending on the user's phrasing.

By comparison, using a vector store allows us to represent the data as vector embeddings, based on meaningful relationships. We can then compare the meaning of the user’s query to the stored content, and retrieve more relevant, context-aware results.

Explore how to build an intelligent chatbot using MongoDB Atlas, Langchain4j and Spring Boot:

>> Building an AI Chatbot in Java With Langchain4j and MongoDB Atlas

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

eBook Jackson – NPI EA – 3 (cat = Jackson)