Webapp isolation, delegation và redeploy leaks
Class identity gồm binary name và defining ClassLoader; cùng tên class từ hai loaders vẫn là hai type khác nhau.
Classloading
Hierarchy
Bootstrap → System → Common; mỗi webapp có WebappClassLoader riêng. Webapp thường local-first theo Servlet rules với protected Java/Jakarta/XML APIs. Shared library ở Common đổi isolation, upgrade cadence và blast radius.
Conflict signatures
Duplicate API/library có thể gây ClassCastException “same class”, NoSuchMethodError, LinkageError hoặc behavior lệch version. Ghi defining loader/code source thay vì chỉ nhìn dependency tree build-time.
Leak roots
Non-daemon threads, executors, ThreadLocal trên container threads, JDBC drivers, timers, logging/JMX registries, static caches và shutdown hooks có thể giữ old WebappClassLoader. Tomcat clearReferences cảnh báo/mitigate một phần, không thay application cleanup.
Proof và remediation
Redeploy lặp có control; lấy heap histogram/dump, classloader count, dominator path và thread dump. Fix lifecycle owner, deregister/close resources rồi chứng minh old loader collectible. Immutable restart giảm exposure nhưng không chữa test/lifecycle sai.