Từ Java 9, JVM tối ưu chuỗi với tính năng Compact Strings. Thay vì mảng char[], chuỗi dùng mảng byte[] kết hợp trường coder xác định encoding: Latin-1 (ISO-8859-1) – 1 byte/ký tự, hoặc UTF-16 – 2 byte/ký tự.
Cơ chế
- Khi tạo String, JVM kiểm tra nội dung.
- Chỉ chứa ký tự Latin-1 → dùng
byte[]1 byte/char,coder=0. - Có ký tự ngoài Latin-1 → dùng
byte[]2 byte/char (UTF-16),coder=1. - Quyết định cố định tại thời điểm tạo, không đổi sau đó.
Cấu trúc nội bộ String
// Java 8
public class String {
private final char[] value;
}
// Java 9+
public class String {
private final byte[] value;
private final byte coder; // 0 = LATIN1, 1 = UTF16
// + hash field (cached hashCode)
}
Cấu hình
- Mặc định: BẬT.
- Tắt:
-XX:-CompactStrings(lưu tất cả chuỗi dạng UTF-16, không revert về char[]).
Lợi ích
| Lợi ích | Giải thích |
|---|---|
| Giảm heap memory | Chuỗi Latin-1 (phổ biến trong app Anh) giảm 50% bộ nhớ. |
| GC nhanh hơn | Ít object hơn, heap nhỏ hơn → GC ít tốn thời gian hơn. |
| Cache locality | Dữ liệu nhỏ hơn → nhiều object hơn trong CPU cache line. |
| Không unpack/repack | Khác với Compressed Strings Java 6, không chuyển đổi giữa byte[]/char[]. |