Understanding Java from the JVM up gives you a solid foundation to grow your expertise and take on advanced techniques for performance, concurrency, containerization, and more.
The Well-Grounded Java Developer, Second Edition introduces both the modern innovations and timeless fundamentals you need to know to become a Java master. Authors Ben Evans, Martijn Verburg, and Jason Clark distill their decades of experience as Java Champions, veteran developers, and key contributors to the Java ecosystem into this clear and practical guide. You’ll discover how Java works under the hood and learn design secrets from Java’s long history. Each concept is illustrated with hands-on examples, including a fully modularized application/library and creating your own multithreaded application.
About the technology
Java is the beating heart of enterprise software engineering. Developers who really know Java can expect easy job hunting and interesting work. Written by experts with years of boots-on-the-ground experience, this book upgrades your Java skills. It dives into powerful features like modules and concurrency models and even reveals some of Java’s deep secrets.
About the book
With The Well-Grounded Java Developer, Second Edition you will go beyond feature descriptions and learn how Java operates at the bytecode level. Master high-value techniques for concurrency and performance optimization, along with must-know practices for build, test, and deployment. You’ll even look at alternate JVM languages like Kotlin and Clojure. Digest this book and stand out from the pack.
What's inside
• The new Java module system
• Performance tuning the JVM
• Working with Java’s built-in concurrency and expanded options
• Programming in Kotlin and Clojure on the JVM
• Maximizing CI/CD with Maven and Gradle
• Running the JVM in containers
• Planning for future JVM releases
About the reader
For intermediate Java developers.
AI Reading Assistant
Whole-book reading guide from stratified index samples; jump to passages in the text
Tip the Site
Support this siteYour recognition and a small knowledge-service contribution help keep this technical work open source.Scan the WeChat Pay or Alipay code below. Logged-in and guest visitors can both tip.
WeChat Pay
Alipay
Open WeChat or Alipay and scan. No login required.
AI guide
# The Well-Grounded Java Developer, 2nd Edition — Reading Guide
## 【One-Line Pitch】
A practical, deep-dive guide for intermediate Java developers who want to understand the JVM from the inside out—covering modules, bytecode, concurrency, performance, and alternative JVM languages—so you can write robust, modern Java for the next decade.
## 【Book Arc】
- **Opening (~0%–9%)**: Introduces the book's mission—turning you into a "Java developer for the next decade"—and clarifies the Java language vs. platform distinction, the dynamic nature of the JVM, and the shift to a time-based release model starting with Java 10.
- **Early (~9%–25%)**: Dives into the Java module system (JPMS), explaining how modules replace the old `rt.jar` approach, how to build modular applications, and the practical limitations of tools like `jlink` when dependencies aren't fully modularized.
- **Early–Middle (~25%–38%)**: Covers modern language features—records, sealed types, and pattern matching—along with class loading internals, including the delegation model, common exceptions like `ClassNotFoundException` vs. `NoClassDefFoundError`, and an introduction to bytecode.
- **Middle (~38%–47%)**: Explores bytecode in depth, teaching you to disassemble classes with `javap`, understand opcodes and the runtime environment, and then transitions into concurrency fundamentals—threads, locks, monitors, and the design forces (safety, liveness, performance, reusability) that shape concurrent systems.
- **Late (~47%–end)**: Continues with advanced concurrency via `java.util.concurrent`, performance tuning, build tools (Maven/Gradle), CI/CD, containerized JVM deployments, and alternative JVM languages like Kotlin and Clojure. (Excerpts thin out here; later chapters are summarized from the book's stated contents.)
## 【Key Takeaways】
- **Java is both compiled and interpreted** (Early): The source compiler `javac` creates class files, but the real work happens via JIT compilation at runtime—the JVM is far more dynamic than it appears. Understanding this duality is foundational for everything else in the book.
- **The module system changes how you structure and deploy Java apps** (Early): Modules provide explicit dependency metadata, enabling efficient loading and custom runtime images via `jlink`. However, `jlink` only works with fully modularized code—a major real-world constraint.
- **Records are data carriers with a contract** (Early): Records auto-generate boilerplate and enforce an `equals()` invariant (copying all components must yield an equal instance). They're a design pattern, like enums, not just syntax sugar.
- **Class loading failures have distinct meanings** (Middle): `ClassNotFoundException` means the class was unknown to the JVM; `NoClassDefFoundError` means the JVM knew of it but couldn't find its definition. Knowing the difference is critical for debugging.
- **Bytecode is an intermediate representation, not machine code** (Middle): Loops and other high-level constructs are compiled away into branch instructions. Using `javap -c -p` to disassemble classes is the key skill for understanding what your code actually does.
- **Reflection enables frameworks that work with unknown types** (Middle): By manipulating objects without static types, you can build libraries that handle types that didn't exist when your code was written—a cornerstone of modern Java tooling.
- **Concurrency design forces often conflict** (Middle): Safety, liveness, performance, and reusability (catalogued by Doug Lea) are the recurring concerns in concurrent systems. Java's low-level thread-and-lock model is powerful but hard; `java.util.concurrent` exists to make it more manageable.
## 【Reading Tips】
- **Skim the opening chapters** (~0–9%) if you're already comfortable with Java basics—the release model and language/platform distinction are useful context but not the meat of the book.
- **Deep-read the module system chapters** (~9–25%): Build the sample modular app yourself, and deliberately break the module descriptor to see the compiler errors. The `jlink` limitations section is essential for real-world planning.
- **Take your time with bytecode** (~38–44%): This is the hardest section. Run `javap` on your own classes, work through the examples slowly, and revisit the earlier example after finishing the opcode catalogue—the chicken-and-egg problem resolves on a second pass.
- **Treat concurrency as a design problem, not just an API** (~44–47%+): Focus on the design forces (safety, liveness, performance, reusability) before diving into `java.util.concurrent` APIs. Understanding *why* concurrency is hard matters more than memorizing classes.
- **Use the later chapters as reference** (47%+): Performance tuning, build tools, and containerization are covered, but the excerpts don't detail them—skim for what you need when you need it.
## 【Coverage Limits】
This guide is based on stratified excerpts covering roughly the first half of the book (through concurrency fundamentals). Later chapters on `java.util.concurrent` details, performance tuning, Maven/Gradle, CI/CD, containers, and Kotlin/Clojure are summarized from the book's stated contents but not deeply analyzed here.
##
Excerpt 1
Clojure on the JVM • Maximizing CI/CD with Maven and Gradle • Running the JVM in containers • Planning for future JVM releases About the reader For intermed...
be opaque to the developer and are implementation-dependent. It is no longer possible to just unzip rt.jar and get back the JDK’s class library. This is just...
FXCancelled { LocalDateTime timestamp(); long orderId(); } We can combine this with a switch expression and type patterns, to give some code like this: FXOrd...
e’ve learned a lot more about how to write concurrent code. It turns out that some of Java’s initial design decisions are quite difficult for most programme...
acquire a lock and give up after a certain amount of time. The key to realizing all of these possibilities is the Lock interface in java.util .concurrent.loc...
onnection is so important that we’re going to say it again: Essentially all modern CPUs are multicore. Performance and concurrency are tied together as c...
ized access methods if neces- sary, as shown in figure 8.4). If you’ve ever looked inside a JAR file (using jar tvf) and seen a load of classes with $ in the...
antics 315 user=> (map get-name authors) Maps the get-name ("Ben Evans" "Martijn Verburg") function over the data user=> (map (fn [y] (:name y)) authors) Al...
Support this siteYour recognition and a small knowledge-service contribution help keep this technical work open source.
Scan the WeChat Pay or Alipay code below. Logged-in and guest visitors can both tip.
WeChat PayAlipay
Open WeChat or Alipay and scan. No login required.
Add Tag
Enter tag name (max 50 characters)
Share E-Book
The Well-Grounded Java Developer, 2nd Edition (Benjamin J. Evans, Martijn Verburg, Jason Clark) (Z-Library)
Scan QR code with your phone to access
Copy the link or scan the QR code to access this e-book on your phone
Share E-Book via Email
Please enter email address
Donation Statistics
¥.00
Total Donations
0
Donation Count
The Well-Grounded Java Developer, 2nd Edition (Benjamin J. Evans, Martijn Verburg, Jason Clark) (Z-Library)
Find Your Favorite Books
Only registered users can comment after logging in. Comments need to be reviewed by administrators before being displayed
Loading comments...
Reply to Comment
Edit Comment