1. Contoh Leak
Entri kelas dalam statik ThreadLocalMap:
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
ThreadLocalMap menggunakan Entri kelas dalam statik untuk melaksanakan
Oleh kerana ThreadLocalMap menggunakan rujukan lemah ThreadLocal sebagai kunci, apabila ThreadLocal ini tidak mempunyai rujukan kuat luaran, ia akan menjadi GC. Pada masa ini, Entri dengan kunci nol akan muncul dalam ThreadLocalMap Sudah tentu, nilai Entri ini tidak akan dapat diakses.
Dalam kes ini, jika utas yang berfungsi semasa belum berakhir, maka nilai dengan kunci nol dirujuk dengan kuat oleh Entry dan Entry dirujuk dengan kuat oleh ThreadLocalMap bagi thread semasa, menyebabkan nilai ini tidak pernah menjadi GC , menyebabkan kebocoran memori.
2. Penyelesaian
Kaedah cleanSomeSlots() dan expungeStaleEntry() ThreadLocalMap boleh mengosongkan nilai dengan kekunci nol. Dalam kaedah set(), get(), dan remove() ThreadLocal, cleanSomeSlots() atau expungeStaleEntry() akan dipanggil untuk mengosongkan semua nilai dengan kekunci null dalam ThreadLocalMap.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kebocoran memori java ThreadLocal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!