Java 面試考題 Cleaner 與 PhantomReference 教學|取代 finalize() 的資源清理

finalize() 從 Java 9 開始 deprecated,Java 18 標記為 deprecated for removal,替代方案是 java.lang.ref.Cleaner。這篇從 PhantomReference 和 ReferenceQueue 的運作原理講起,說明 Cleaner 如何用獨立的清理執行緒安全地回收 native 資源,解決 finalize 的兩次 GC 回收、物件復活、執行時機不可控等問題,附完整程式碼範例、常見錯誤用法與 JDK 內部的實際應用案例。

Java GC 完整解析|垃圾回收原理、七種 GC 比較、面試重點整理

Java GC 是技術面試必考也是 JVM 效能調校的關鍵知識。這篇從 Heap 的 Young Gen、Old Gen 分代結構與 GC Roots 可達性分析講起,整理 Mark-Sweep、Copying、Mark-Compact 三種基礎回收演算法的差異,再逐一比較 Serial、Parallel、CMS、G1、ZGC、Shenandoah、Epsilon 七種收集器的設計取捨與適用場景,附 JVM 參數速查表與面試高頻問題整理。

Java 21 全新 Virtual Threads 教學|JDK 21 虛擬執行緒與 Thread Pool 比較

Virtual Threads 是 JDK 21 正式推出的輕量執行緒,讓 JVM 在少數 OS thread 上多工跑大量虛擬執行緒,不用再靠加大 thread pool 來撐高並發 IO。這篇從 Platform Thread 的瓶頸講起,整理 carrier thread 的 mount / unmount 機制、API 用法、pinning 問題與 JDK 24 的改善,附 Spring Boot 整合設定與常見陷阱。

Java的Arrays.asList()與List.of()差別

Arrays全名是java.util.Arrays,是自Java 1.2就有的API。而List(java.util.List)雖然也是Java 1.2就開始有的API,其中的List.of()卻是Java 9才新增的方法。Arrays.asList()與List.of()兩種都是快速建立List物件的方法,但使用上有不太一樣的地方。本文講解兩種List物件的差異,以及為什麼會有這兩種方式產生串列。

Spring Data JPA與Hibernate報錯failed to lazily initialize a collection

在Java使用Spring或是Hibernate時,使用OneToMany、ManyToMany來標注Entity Class非常方便,可以輕鬆處理外來鍵與外來資料表的問題。但偶爾使用getXXX()方法要讀取外來資料表的時候,可能會遇到Hibernate報錯說「org.hibernate.LazyInitializationException: failed to lazily initialize a collection」,本篇文章將解析為什麼會發生這種問題,以及要怎麼解決它。

使用Java擷取檔案副檔名、判斷檔案類型(不用第三方套件)

本篇教學文章示範如何使用Java不透過第三方套件來判斷檔案的副檔名,以及檔案類型,只需要Java 7的NIO就可以達成,再加上Java 8的Optional與Stream API來更優雅的處理。使用原生的API可以避免一些問題,例如執行時還需要第三方套件、第三方套件還包含太多用不上的API徒增檔案大小、第三方套件不更新可能有漏洞等麻煩。