Ada metode di thread yang sering dipanggil oleh semua orang, yaitu ThreadLocal. Namun, ThreadLocal juga akan menghadapi masalah yang lebih sulit dalam pemrosesan memori, dan beberapa kebocoran memori akan selalu terjadi. Artikel ini akan menggunakan contoh kebocoran untuk menganalisis semua orang, dan juga membantu Anda memahami beberapa situasi kebocoran, dan mengusulkan solusi yang sesuai dengan ThreadLocal.
1. Contoh kebocoran
Entri kelas dalam statis dari ThreadLocalMap:
Entri kelas statis extends WeakReference<ThreadLocal<?>> { /** Nilai yang terkait dengan ThreadLocal ini */ Nilai objek; Entri(ThreadLocal<?> k, Objek v) { super(k); nilai = v; } }
ThreadLocalMap menggunakan kelas internal statis Entry untuk mengimplementasikan penyimpanan <k, v>, dan Entry mewarisi kelas WeakReference, sehingga kunci dalam ThreadLocalMap sebenarnya adalah referensi lemah ke ThreadLocal.
Justru karena ThreadLocalMap menggunakan referensi lemah ThreadLocal sebagai kuncinya, ketika ThreadLocal ini tidak memiliki referensi kuat eksternal, maka itu akan menjadi GC. Saat ini, Entri dengan kunci nol akan muncul di ThreadLocalMap. Tentu saja, nilai Entri ini tidak akan pernah dapat diakses.
Dalam hal ini, jika thread kerja saat ini belum berakhir, maka nilai dengan kunci null direferensikan secara kuat oleh Entry, dan Entry direferensikan secara kuat oleh ThreadLocalMap dari thread saat ini, menyebabkan nilai ini tidak pernah di-GC, menyebabkan memori bocor.
2. Solusi
Metode cleanSomeSlots() dan expungeStaleEntry() ThreadLocalMap dapat menghapus nilai dengan kunci null. Dalam metode set(), get(), dan delete() dari ThreadLocal, cleanSomeSlots() atau expungeStaleEntry() akan dipanggil untuk menghapus semua nilai dengan kunci null di ThreadLocalMap.
Di atas adalah solusi untuk kebocoran memori java ThreadLocal. Tentu saja ini hanya berperan tertentu dalam kebocoran memori .