Modern Java Web Development Resources (2024 Edition)

Sharing some up-to-date Java resources for anyone diving into web development. The ecosystem has evolved, but the core fundamentals remain rock solid.

Official Documentation & Tutorials

Application Servers & Containers

  • Apache Tomcat 10: Apache Tomcat – Lightweight, reliable servlet container. Now supports Jakarta Servlet 5.0+.
  • Eclipse Jetty: Jetty Documentation – Embedded alternative, great for microservices.
  • Payara Server: Payara Platform – If you need a full Jakarta EE runtime.

Learning & Community

  • Baeldung: Baeldung Java Tutorials – Practical guides on Spring, security, and modern Java.
  • Java Code Geeks: JCGs – Tutorials and articles from the community.
  • Stack Overflow: Always worth a search for specific issues.

Tooling

  • Maven Central: Search for dependencies
  • Gradle: Build tool of choice for many modern projects.
  • IntelliJ IDEA Community: Free, powerful IDE with excellent Java support.

Pro tip: If you’re still on older JSP/Servlet projects, consider migrating to Facelets (JSF) or a framework like Spring MVC. But learning the fundamentals first gives you a solid foundation. Happy coding!

Great write-up, saint. I wanted to add some updates based on modern JVM profiling practices as of 2026.

First, JVMPI has been completely removed since JDK 8, and JVMTI remains but is rarely used directly for profiling nowadays. The industry standard is Java Flight Recorder (JFR) and JDK Mission Control. JFR is a built-in, low-overhead profiling and event recording framework that ships with the JDK. It can capture method sampling, lock profiles, GC events, and heap statistics with minimal impact on production systems.

For heap analysis, modern tools like Eclipse Memory Analyzer (MAT) and IntelliJ Profiler leverage JFR dumps. Another popular open-source tool is async-profiler, which uses a combination of JFR and eBPF (on Linux) to provide CPU and allocation profiling with almost zero overhead.

Regarding JVM memory spaces, the generational model still holds, but modern collectors like G1 (default since JDK 9) and ZGC (low-latency, available since JDK 11) have different region-based architectures. G1 splits the heap into many regions, not just young/old. ZGC and Shenandoah use concurrent compaction to avoid long pause times. Explicitly nulling variables is largely unnecessary with modern JIT compilers; the JVM can optimize object lifetimes. The advice on avoiding System.gc() is still valid; instead, use jcmd or JFR to trigger GC if needed.

For monitoring, jstat and jconsole are still useful but limited. I recommend JDK Mission Control (open source) or Grafana + Prometheus with the JVM metrics exporter for production monitoring.

Lastly, if you’re still using the tools mentioned (jconsole, jstat), consider migrating to JFR-based workflows. Here’s a quick example of recording a profile:

# Start recording with JFR for 60 seconds
jcmd <PID> JFR.start duration=60s filename=profile.jfr

Then open the .jfr file in JDK Mission Control to analyze hotspots, memory leaks, and GC behavior.

Feel free to ask if you want a deeper dive into any specific tool!