{"id":4035,"date":"2026-09-18T10:00:00","date_gmt":"2026-09-18T14:00:00","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=4035"},"modified":"2026-09-18T08:36:30","modified_gmt":"2026-09-18T12:36:30","slug":"whats-new-in-jdk-26-features-jeps-and-enhancements","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/java\/whats-new-in-jdk-26-features-jeps-and-enhancements\/","title":{"rendered":"What&#8217;s New in JDK 26: Features, JEPs, and Enhancements"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Released on <strong>March 17, 2026<\/strong>, <strong>JDK 26<\/strong> is the six-month feature release following Java 25 (LTS). Bringing <strong>10 official JDK Enhancement Proposals (JEPs)<\/strong> along with critical HotSpot runtime optimizations, JDK 26 introduces modern networking protocols, tightens language safety, optimizes garbage collection throughput, and refines concurrency patterns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a comprehensive breakdown of everything included in Java 26.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">At a Glance: The 10 JEPs of JDK 26<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>JEP<\/strong><\/td><td><strong>Category<\/strong><\/td><td><strong>Status<\/strong><\/td><td><strong>Summary<\/strong><\/td><\/tr><tr><td><strong>500<\/strong><\/td><td>Core Libraries<\/td><td>Permanent<\/td><td><strong>Prepare to Make Final Mean Final<\/strong> (Restricts reflective mutation of <code>final<\/code> fields)<\/td><\/tr><tr><td><strong>504<\/strong><\/td><td>Client \/ Core<\/td><td>Permanent<\/td><td><strong>Remove the Applet API<\/strong> (Complete removal of <code>java.applet.*<\/code>)<\/td><\/tr><tr><td><strong>516<\/strong><\/td><td>HotSpot \/ Runtime<\/td><td>Permanent<\/td><td><strong>Ahead-of-Time Object Caching with Any GC<\/strong> (Expands AOT caching to ZGC and others)<\/td><\/tr><tr><td><strong>517<\/strong><\/td><td>Core Libraries<\/td><td>Permanent<\/td><td><strong>HTTP\/3 for the HTTP Client API<\/strong> (Adds native HTTP\/3 and QUIC support)<\/td><\/tr><tr><td><strong>522<\/strong><\/td><td>HotSpot \/ GC<\/td><td>Permanent<\/td><td><strong>G1 GC: Improve Throughput by Reducing Synchronization<\/strong> (Streamlined write barriers)<\/td><\/tr><tr><td><strong>524<\/strong><\/td><td>Security<\/td><td>2nd Preview<\/td><td><strong>PEM Encodings of Cryptographic Objects<\/strong> (Standardized API for PEM parsing\/encoding)<\/td><\/tr><tr><td><strong>525<\/strong><\/td><td>Concurrency<\/td><td>6th Preview<\/td><td><strong>Structured Concurrency<\/strong> (Task coordination with new <code>onTimeout()<\/code> joins)<\/td><\/tr><tr><td><strong>526<\/strong><\/td><td>Core Libraries<\/td><td>2nd Preview<\/td><td><strong>Lazy Constants<\/strong> (Formerly <em>Stable Values<\/em>; high-efficiency deferred evaluation)<\/td><\/tr><tr><td><strong>529<\/strong><\/td><td>Performance<\/td><td>11th Incubator<\/td><td><strong>Vector API<\/strong> (Expressing vector computations across modern SIMD architectures)<\/td><\/tr><tr><td><strong>530<\/strong><\/td><td>Language Specification<\/td><td>4th Preview<\/td><td><strong>Primitive Types in Patterns, instanceof, and switch<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1. Network Modernization: HTTP\/3 Support<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 517: HTTP\/3 for the HTTP Client API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Java\u2019s standard <code>java.net.http.HttpClient<\/code> (introduced in Java 11) previously supported HTTP\/1.1 and HTTP\/2 over TCP. JDK 26 introduces native support for <strong>HTTP\/3 over QUIC<\/strong> (UDP-based).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">HTTP\/3 solves head-of-line blocking at the transport layer, accelerates connection handshakes (often 0-RTT), and offers seamless connection migration between IP networks.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class Http3Demo {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ Configure the client to negotiate HTTP\/3\n        HttpClient client = HttpClient.newBuilder()\n                .version(HttpClient.Version.HTTP_3)\n                .build();\n\n        HttpRequest request = HttpRequest.newBuilder(URI.create(\"https:\/\/example.com\/api\"))\n                .version(HttpClient.Version.HTTP_3)\n                .GET()\n                .build();\n\n        HttpResponse&lt;String&gt; response = client.send(\n                request, \n                HttpResponse.BodyHandlers.ofString()\n        );\n\n        System.out.println(\"Protocol Version: \" + response.version());\n        System.out.println(\"Response Status: \" + response.statusCode());\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If an endpoint does not support HTTP\/3 via QUIC, the client seamlessly falls back to HTTP\/2 or HTTP\/1.1 via standard ALPN negotiation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Language Semantics &amp; Pattern Matching<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 500: Prepare to Make Final Mean Final<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Historically, Java developers could use reflection to bypass the <code>final<\/code> keyword and mutate fields at runtime via <code>Field.setAccessible(true)<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Config {\n    final String apiKey = \"INITIAL_KEY\";\n}\n\n\/\/ In previous versions:\nField field = Config.class.getDeclaredField(\"apiKey\");\nfield.setAccessible(true);\nfield.set(configInstance, \"MUTATED_KEY\"); \/\/ Allowed, breaking JVM assumptions\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">JEP 500 begins the process of eliminating this loophole. In JDK 26:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reflective mutation of <code>final<\/code> fields now issues a <strong>runtime warning<\/strong> by default.<\/li>\n\n\n\n<li>Developers can configure the JVM flag <code>--enable-final-field-mutation=ALL-UNNAMED<\/code> to suppress warnings during transitions.<\/li>\n\n\n\n<li>In future releases, mutating <code>final<\/code> fields will throw an exception.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This change allows the HotSpot JIT compiler to perform more aggressive optimizations (such as constant folding and field inlining) with total confidence.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 530: Primitive Types in Patterns, instanceof, and switch (4th Preview)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Java continues unifying primitive types and reference types under Project Amber. JEP 530 allows primitive types (<code>int<\/code>, <code>byte<\/code>, <code>float<\/code>, <code>double<\/code>, etc.) in pattern matching contexts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void evaluate(Object obj) {\n    switch (obj) {\n        case byte b  -&gt; System.out.println(\"Byte value: \" + b);\n        case int i   -&gt; System.out.println(\"Integer value: \" + i);\n        case long l  -&gt; System.out.println(\"Long integer: \" + l);\n        case double d -&gt; System.out.println(\"Double float: \" + d);\n        default      -&gt; System.out.println(\"Non-numeric object: \" + obj);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">What&#8217;s new in the 4th Preview:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Refined unconditional exactness<\/strong>: Stricter mathematical definitions to guarantee safe conversions without unexpected loss of precision.<\/li>\n\n\n\n<li><strong>Tighter dominance checks<\/strong>: Enhanced compile-time validation preventing unreachable pattern branches.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. High-Performance Runtime &amp; Memory Improvements<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 516: Ahead-of-Time (AOT) Object Caching with Any GC<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Under Project Leyden, AOT Object Caching pre-compiles and pre-initializes core classes and application states to slash startup and warmup times. Previously, cached objects had to be tailored to specific garbage collectors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JDK 26 decouples object caching from memory layout:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cached objects are now stored in a <strong>GC-agnostic, logical index format<\/strong> rather than physical addresses.<\/li>\n\n\n\n<li>Applications using <strong>ZGC<\/strong> (Generational ZGC) can now fully leverage Leyden&#8217;s AOT object cache without being forced back to Serial or G1 GC during cache preparation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 522: G1 GC: Improve Throughput by Reducing Synchronization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Garbage-First (G1) collector achieves high responsiveness by tracking cross-region pointer modifications using <strong>write barriers<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In JDK 26, the synchronization overhead between application threads and G1 concurrent refining threads has been significantly re-engineered:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The x86-64 write barrier instruction count drops from approximately <strong>~50 instructions down to ~12<\/strong>.<\/li>\n\n\n\n<li>Benchmarks show <strong>5% to 15% throughput improvements<\/strong> in reference-heavy enterprise applications without sacrificing latency.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Additional HotSpot Optimizations in JDK 26<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Smaller Default Heap (<code>MinHeapSize<\/code>)<\/strong>: For applications running with unspecified initial heap sizes, the JVM now starts at <code>MinHeapSize<\/code> rather than relying on <code>InitialRAMPercentage<\/code>, decreasing container memory footprints and cold-start latency.<\/li>\n\n\n\n<li><strong>Record <code>hashCode()<\/code> Performance<\/strong>: Auto-generated hash calculations for <code>record<\/code> classes are now vectorized and compiled with intrinsics, accelerating hashing lookups in hash-maps and sets.<\/li>\n\n\n\n<li><strong>MemorySegment to String Zero-Copy<\/strong>: Memory-segment conversions to <code>java.lang.String<\/code> eliminate redundant intermediate allocations.<\/li>\n\n\n\n<li><strong>C2 Compiler Scalability<\/strong>: HotSpot\u2019s C2 JIT compiler can now compile methods containing unusually large parameter lists that were previously kept in the slower interpreter or C1 tier.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Modernized Libraries &amp; Security<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 526: Lazy Constants (2nd Preview)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Formerly known as <em>Stable Values<\/em> in JDK 25, JEP 526 provides an official, thread-safe, high-performance mechanism for deferred initialization:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.lang.LazyConstant;\n\npublic class DatabaseService {\n    \/\/ Computes value only once on demand, then treats it like a compile-time constant\n    private static final LazyConstant&lt;ConnectionPool&gt; DB_POOL = \n            LazyConstant.of(() -&gt; initPool());\n\n    public static ConnectionPool getPool() {\n        return DB_POOL.get();\n    }\n\n    private static ConnectionPool initPool() {\n        return new ConnectionPool(\"jdbc:postgresql:\/\/localhost:5432\/main\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike double-checked locking or manual volatile checks, <code>LazyConstant<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guarantees thread-safe single initialization.<\/li>\n\n\n\n<li>Disallows <code>null<\/code> values for consistent semantics.<\/li>\n\n\n\n<li>Allows the JIT compiler to optimize subsequent reads with constant-folding performance equivalent to a <code>static final<\/code> field.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 524: PEM Encodings of Cryptographic Objects (2nd Preview)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reading and writing PEM-formatted keys (<code>.pem<\/code>, <code>.crt<\/code>, <code>.key<\/code>) typically required external dependencies like BouncyCastle. JEP 524 standardizes native PEM parsing and encoding.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Updates in JDK 26:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The class name is simplified from <code>PEMRecord<\/code> to <code>PEM<\/code>.<\/li>\n\n\n\n<li>Built-in support for encrypting and decrypting <code>KeyPair<\/code> and <code>PKCS8EncodedKeySpec<\/code> objects directly within <code>PEMEncoder<\/code> and <code>PEMDecoder<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Concurrency &amp; Vector Computing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 525: Structured Concurrency (6th Preview)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Structured Concurrency treats multi-threaded subtasks as a single unit of work, significantly simplifying error propagation and cancellation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.concurrent.StructuredTaskScope;\n\nResponse handleRequest() throws Exception {\n    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n        StructuredTaskScope.Subtask&lt;UserData&gt; userSubtask = \n                scope.fork(() -&gt; fetchUserData());\n        StructuredTaskScope.Subtask&lt;OrderHistory&gt; orderSubtask = \n                scope.fork(() -&gt; fetchOrderHistory());\n\n        scope.join();           \/\/ Synchronize both tasks\n        scope.throwIfFailed();  \/\/ Propagate exceptions\n\n        return new Response(userSubtask.get(), orderSubtask.get());\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In JDK 26, the <code>StructuredTaskScope.Joiner<\/code> interface adds an <code>onTimeout()<\/code> callback, making it simple to execute fallback logic or partial aggregation when deadlines elapse.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 529: Vector API (11th Incubator)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Vector API continues in incubator status as it coordinates with <strong>Project Valhalla<\/strong>. It enables developers to express SIMD (Single Instruction Multiple Data) calculations directly in Java:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static final VectorSpecies&lt;Float&gt; SPECIES = FloatVector.SPECIES_PREFERRED;\n\nvoid vectorAdd(float&#91;] a, float&#91;] b, float&#91;] c) {\n    int i = 0;\n    int upperBound = SPECIES.loopBound(a.length);\n    for (; i &lt; upperBound; i += SPECIES.length()) {\n        var va = FloatVector.fromArray(SPECIES, a, i);\n        var vb = FloatVector.fromArray(SPECIES, b, i);\n        var vc = va.add(vb);\n        vc.intoArray(c, i);\n    }\n    for (; i &lt; a.length; i++) {\n        c&#91;i] = a&#91;i] + b&#91;i]; \/\/ Tail clean-up\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Vector API remains in incubation until Valhalla value objects become finalized, which will allow vector primitives to be lightweight, identity-free values on the JVM stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. End of an Era: Complete Removal of the Applet API<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JEP 504: Remove the Applet API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First deprecated in Java 9 and marked for removal in Java 17, the <strong>Applet API<\/strong> has been completely excised from the JDK in version 26.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Classes removed include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>java.applet.Applet<\/code><\/li>\n\n\n\n<li><code>java.applet.AppletStub<\/code><\/li>\n\n\n\n<li><code>java.applet.AppletContext<\/code><\/li>\n\n\n\n<li><code>java.applet.AudioClip<\/code><\/li>\n\n\n\n<li><code>javax.swing.JApplet<\/code><\/li>\n\n\n\n<li><code>java.beans.AppletInitializer<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Legacy code targeting applets must migrate to modern desktop architectures (such as JavaFX) or web frontends.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary &amp; Upgrade Guidance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JDK 26 delivers targeted refinements across developer productivity, security, and performance:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>For Web &amp; Cloud Services<\/strong>: Native <strong>HTTP\/3<\/strong> and <strong>AOT Object Caching for ZGC<\/strong> provide faster responses and lower cold-start latency.<\/li>\n\n\n\n<li><strong>For High-Throughput Systems<\/strong>: The <strong>G1 write-barrier overhaul<\/strong> and <strong>Lazy Constants<\/strong> optimize execution paths and reduce memory synchronization bottlenecks.<\/li>\n\n\n\n<li><strong>For Clean Code &amp; Security<\/strong>: <strong>PEM decoding\/encoding<\/strong> and the gradual enforcement of <strong>immutable <code>final<\/code> fields<\/strong> reduce reliance on external libraries and brittle reflection hacks.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Released on March 17, 2026, JDK 26 is the six-month feature release following Java 25 (LTS). Bringing 10 official JDK Enhancement Proposals (JEPs) along with critical HotSpot runtime optimizations, JDK 26 introduces modern networking protocols, tightens language safety, optimizes garbage collection throughput, and refines concurrency patterns. Here is a comprehensive breakdown of everything included in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[280],"tags":[69,498],"series":[],"class_list":["post-4035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-2","tag-jdk"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/09\/Gemini_Generated_Image_rgp2zkrgp2zkrgp2-scaled.avif","jetpack-related-posts":[{"id":3619,"url":"https:\/\/www.mymiller.name\/wordpress\/java_new_features\/virtual-threads-revolutionizing-concurrency-in-jdk-21\/","url_meta":{"origin":4035,"position":0},"title":"Virtual Threads: Revolutionizing Concurrency in JDK 21","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"In JDK 21, Java introduces a groundbreaking feature that\u2019s poised to redefine how we handle concurrency: virtual threads. Virtual threads promise to simplify concurrent programming, improve application scalability, and unlock new levels of efficiency. Let\u2019s delve into what virtual threads are and how you can harness their power. The Challenge\u2026","rel":"","context":"In &quot;Java New Features&quot;","block_context":{"text":"Java New Features","link":"https:\/\/www.mymiller.name\/wordpress\/category\/java_new_features\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8241450_640.jpg?fit=640%2C480&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8241450_640.jpg?fit=640%2C480&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8241450_640.jpg?fit=640%2C480&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3594,"url":"https:\/\/www.mymiller.name\/wordpress\/docker\/fips-jdk-21-image\/","url_meta":{"origin":4035,"position":1},"title":"FIPS JDK 21 Image","author":"Jeffery Miller","date":"July 12, 2024","format":false,"excerpt":"Warning: Use FIPS Instructions at Your Own Risk The provided Dockerfile and instructions are intended to assist in creating a FIPS-compliant environment for your Spring Boot application. However, achieving and maintaining FIPS compliance is a complex process with potential legal and security implications. By following these instructions, you acknowledge and\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/www.mymiller.name\/wordpress\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 3x"},"classes":[]},{"id":3249,"url":"https:\/\/www.mymiller.name\/wordpress\/java_tips\/java-tips-part-5\/","url_meta":{"origin":4035,"position":2},"title":"Java Tips Part 5","author":"Jeffery Miller","date":"August 19, 2026","format":false,"excerpt":"Tip 21: Use Prepared Statements When working with JPA\/Hibernate make use of Prepared Statements that can be reused. Basically, I'm saying do not do the following: Query query = JPA.em().createNativeQuery(\"select count(*) from user u inner join\" + \"address a where a.user_id=u.id and a.city='\" + city + \"'\"); BigInteger val =\u2026","rel":"","context":"In &quot;Java Tips&quot;","block_context":{"text":"Java Tips","link":"https:\/\/www.mymiller.name\/wordpress\/category\/java_tips\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/12\/sam-dan-truong-rF4kuvgHhU-unsplash-scaled-e1640791434235.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/12\/sam-dan-truong-rF4kuvgHhU-unsplash-scaled-e1640791434235.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/12\/sam-dan-truong-rF4kuvgHhU-unsplash-scaled-e1640791434235.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3912,"url":"https:\/\/www.mymiller.name\/wordpress\/uncategorized\/spring-boot-4-0-whats-next-for-the-modern-java-architect\/","url_meta":{"origin":4035,"position":3},"title":"Spring Boot 4.0: What&#8217;s Next for the Modern Java Architect?","author":"Jeffery Miller","date":"September 24, 2025","format":false,"excerpt":"A Forward-Looking Comparison of Spring Boot 3.x and 4.0 Staying on top of the rapidly evolving Java ecosystem is paramount for any software architect. The shift from Spring Boot 2.x to 3.x brought significant changes, notably the move to Jakarta EE. Now, with the horizon of Spring Boot 4.0 and\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 3x"},"classes":[]},{"id":3444,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_discovery\/spring-boot-admin-server-with-spring-cloud-discovery\/","url_meta":{"origin":4035,"position":4},"title":"Spring Boot Admin Server with Spring Cloud Discovery","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Spring Boot Admin Server is a powerful tool for monitoring and managing Spring Boot applications. It provides a centralized dashboard for viewing application health, metrics, and logs. Spring Cloud Discovery, on the other hand, enables service registration and discovery for microservices-based applications. By integrating Spring Boot Admin Server with Spring\u2026","rel":"","context":"In &quot;Spring Discovery&quot;","block_context":{"text":"Spring Discovery","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_discovery\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/manhattan-3866140_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/manhattan-3866140_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/manhattan-3866140_640.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3441,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_discovery\/spring-cloud-gateway-with-spring-cloud-discovery\/","url_meta":{"origin":4035,"position":5},"title":"Spring Cloud Gateway with Spring Cloud Discovery","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Spring Cloud Gateway and Spring Cloud Discovery are powerful tools for building microservices architectures. Spring Cloud Gateway acts as an API gateway, routing requests to the appropriate microservices. Spring Cloud Discovery provides a registry for microservices, enabling dynamic service discovery and load balancing. In this comprehensive guide, we'll delve into\u2026","rel":"","context":"In &quot;Spring Discovery&quot;","block_context":{"text":"Spring Discovery","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_discovery\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/4035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=4035"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/4035\/revisions"}],"predecessor-version":[{"id":4037,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/4035\/revisions\/4037"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/4036"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=4035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=4035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=4035"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=4035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}