Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog

#jvm

Things I've written about #jvm
  • Java 27: Compact Object Headers

    Từ Java 27, Compact Object Headers (Project Lilliput) được bật mặc định: header của object trên HotSpot co từ 12 xuống 8 bytes. Bài mổ xẻ 64 bit header được sắp ra sao, class pointer nén còn 22 bit thế nào, lock và GC xoay xở thế nào, lợi gì cho CPU cache và các cờ JVM cần biết.

  • Java Memory Model & happens-before

    Đào vào Java Memory Model (JSR-133): giao thức MESI, Store Buffer, 4 loại Memory Barrier, quan hệ Happens-Before, chuyện False Sharing (@Contended), và Acquire/Release với VarHandle từ Java 9.

  • in java / jvm

    Generational ZGC trong java 21

    Heap lên tới vài chục, vài trăm GB thì mấy GC truyền thống như G1 hay Parallel hay kéo theo những lần Stop-The-World (STW) dài cả giây, dịch vụ đứng hình. Generational ZGC trong Java 21+ dùng Colored Pointers, Load Barriers (và Store Barriers) ra sao để giữ pause GC dưới 1 mili-giây.

  • GraalVM Native Image vs JVM JIT

    GraalVM Native Image khởi động trong vài chục tới vài trăm mili-giây, ăn RAM rất ít nên đang được dân Serverless và Kubernetes chuộng. Nhưng AOT có thay hẳn được HotSpot JIT không? Mổ xẻ kiến trúc, số đo minh hoạ, những thứ bạn buộc phải đánh đổi và các lựa chọn khác như Project Leyden.

  • java 25 LTS

    A close look at Java 25 LTS: Compact Object Headers (JEP 519), Stream Gatherers (JEP 485), Flexible Constructor Bodies (JEP 513), Scoped Values (JEP 506) and Generational ZGC, with notes on what they change for high-throughput cloud services.

  • câu hỏi phỏng vấn java senior

    Các câu hỏi phỏng vấn nâng cao cho Senior & Staff Software Engineer: False Sharing & Cache Line 64-byte, bẫy Carrier Pinning trong Virtual Threads, Parent-Child Connection Starvation trong HikariCP, Zero-Allocation trên đường dẫn hiệu năng cao và thiết kế Idempotency.

  • singleton pattern

    Singleton Pattern nhìn kỹ hơn một chút: vì sao việc đảo lệnh của JIT và CPU buộc Double-Checked Locking phải có volatile, 4 cách phá Singleton (Reflection, Serialization, Clone, ClassLoader) và vì sao dự án Spring nên để IoC Container quản lý singleton.

  • functional interfaces & lambda trong java

    Lambda và Functional Interface chạy thế nào bên trong JVM: vì sao lambda không phải Anonymous Inner Class, invokedynamic và LambdaMetafactory làm gì, tại sao biến phải effectively final, và cách dựng một Policy Engine bằng hàm.

  • in java / jvm

    Optional trong Java

    Nhìn kỹ Java Optional: mỗi instance tốn 16-24 bytes heap và khi nào thì chuyện đó thật sự đáng lo, 6 anti-pattern hay gặp, khác biệt quan trọng giữa orElse và orElseGet, và cách làm null-safety bài bản hơn với JSpecify.

  • Spring Boot Auto-configuration

    Spring Boot Auto-Configuration chạy thế nào bên dưới: AutoConfigurationImportSelector, bộ lọc sớm dựa trên metadata sinh lúc build, ASM đọc annotation mà không nạp class, thứ tự của DeferredImportSelector, chuyển từ spring.factories sang AutoConfiguration.imports, và cách viết một Custom Starter dùng được trên production.

  • java records

    Hiểu Java Records cho đúng: "transparent carrier" nghĩa là gì, vì sao serialization của Record an toàn hơn, Pattern Matching với Sealed Types, Shallow vs Deep Immutability và mấy cái bẫy khi đem Record dùng với JPA / Hibernate.

  • in java / jvm

    java reflection

    Mổ xẻ Java Reflection bên trong JVM: cơ chế inflation từ JNI sang bytecode accessor (tới JDK 17) và bản viết lại bằng method handle từ JDK 18, vì sao reflection khó cho JIT inline, chuyện setAccessible bị chặn từ JDK 16/17, và vì sao MethodHandles cùng code sinh lúc compile hợp với GraalVM AOT hơn.

  • in java / jvm

    string vs stringbuilder vs stringbuffer

    Chuỗi ký tự trong JVM hoạt động thế nào: Compact Strings (JEP 254), việc toán tử + chuyển từ StringBuilder sang invokedynamic StringConcatFactory (JEP 280), so sánh String, StringBuilder, StringBuffer và chuyện JIT bỏ lock của StringBuffer nhờ Escape Analysis.

  • in java / jvm

    java string pool

    Đi sâu vào StringTable native trong HotSpot JVM: vì sao String Pool dời từ PermGen sang Java Heap, bảng băm C++ từng tụt từ O(1) về O(N) ra sao và JDK 11 sửa thế nào, cái bẫy của String.intern(), và String Interning khác String Deduplication (JEP 192) chỗ nào.

  • in java / jvm

    kiến trúc JVM

    Đi một vòng bên trong HotSpot JVM cho dân làm phần mềm: file bytecode 0xCAFEBABE trông ra sao, ClassLoader uỷ quyền theo Parent Delegation Model thế nào, các vùng nhớ Runtime Data Areas (Stack Frame, Metaspace, Heap), và JIT biên dịch phân tầng (Tiered Compilation C1/C2).