1. The Execution Lifecycle of a Java Application
    • This blog post describes in details what happens when executing a Java application. After reading this post, you will understand the execution lifecycle of a Java application and the activities performed by the JVM during the execution phase.

  2. The Dynamic Features of Java
    • The existence of dynamic features built in the language allows Java developers to transform their program executions at runtime dynamically. However, these features in most Java programs are a fundamental problem for static analysis tools that rely on precise call-graph construction. Notably, the GraalVM compiler relies on points-to analysis to perform AOT compilation. This blog post covers the main dynamic features of Java and the reasons why they are still a long-standing issue for researchers and practitioners in program analysis.

  3. Inversion of Control and Dependency Injection in Java
    • This blog post explains Inversion of Control and Dependency Injection in Java. These concepts are the backbone of modern enterprise Java frameworks.

  4. AOT vs. JIT Compilation in Java
    • AOT compilation, supported by the GraalVM compiler, seems to be the future for Java and the programming languages that compile to JVM bytecode. But what is the difference between compiling source code using a JIT compiler w.r.t using an AOT compiler? This post explains the difference between these two approaches.

  5. Encoding, Encryption, Hashing, and Obfuscation in Java
    • The concepts of encoding, encryption, hashing, and obfuscation are often mistakenly confused or taken as similar (which is even worse). Let's clarify this matter and see some Java code examples of practical applications.

  6. The Fork/Join Java framework
    • The Fork/Join framework in Java simplifies parallel programming by allowing developers to leverage multiple processor cores without manually managing threads. This post introduces the key concepts of this framework, including task splitting (fork) and result combining (join). I also provide practical examples using RecursiveAction and RecursiveTask for parallelizing tasks. By utilizing this framework, developers can boost application performance and streamline the implementation of parallel algorithms.

  7. The Producer-Consumer Pattern in Java Made Easy
    • The Producer-Consumer pattern is a powerful design strategy used to decouple the production of data from its processing, enabling parallelism and efficient data handling. This post is about how to implement this pattern in Java using the BlockingQueue interface, allowing for easy, thread-safe coordination between producers and consumers. This guide walks through a real-world example, demonstrating how to produce and consume data in parallel with minimal synchronization complexity.

  8. Deploying to Maven Central
    • Deploying to Maven Central is essential for sharing Java libraries with the world. In this post, I provide a detailed, step-by-step guide on how to deploy a software artifact to Maven Central, covering everything from setting up a Sonatype account to configuring POM files. By following this tutorial, you'll be able to streamline your deployment process and ensure your libraries are available for reuse to all developers out there.