Rumah >Java >javaTutorial >Bagaimana untuk menyelesaikan kebocoran memori java ThreadLocal

Bagaimana untuk menyelesaikan kebocoran memori java ThreadLocal

王林
王林ke hadapan
2023-05-18 10:25:051428semak imbas

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 Kemasukan Mewarisi kelas WeakReference, jadi kunci dalam ThreadLocalMap sebenarnya adalah rujukan lemah kepada ThreadLocal.

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam