Diberikan kelas utilitas hipotetis yang hanya digunakan dalam pengaturan program:
class MyUtils {
private static MyObject myObject = new MyObject();
/*package*/static boolean doStuff(Params... params) {
// do stuff with myObject and params...
}
}
akankah myObject menjadi sampah yang dikumpulkan ketika tidak lagi digunakan, atau akankah tetap ada selama program berjalan?
java
static
garbage-collection
static-members
Michael Deardeuff
sumber
sumber
Variabel statis direferensikan oleh objek Kelas yang direferensikan oleh ClassLoaders -jadi kecuali ClassLoader menjatuhkan Kelas entah bagaimana (jika itu mungkin) atau ClassLoader itu sendiri menjadi memenuhi syarat untuk koleksi (lebih mungkin - pikirkan unloading webapps) variabel statis (atau sebaliknya, objek yang mereka referensikan) tidak akan dikumpulkan.
sumber
Class
objek yang tidak berisi variabel statis dirujuk oleh pemuat kelasnya?Jika Anda ingin objek sementara digunakan untuk inisialisasi statis kemudian dibuang, Anda dapat menggunakan blok inisialisasi statis, mis.
karena blok penginisialisasi statis adalah jenis khusus dari metode statis, myObject adalah variabel lokal dan dapat dikumpulkan dari sampah setelah blok selesai dieksekusi.
sumber
myObject adalah referensi dan bukan objek . Sebuah objek secara otomatis dikumpulkan sampah ketika tidak ada referensi yang mengarah padanya karena tidak dapat dijangkau.
Begitu juga objek di balik referensi statis "myObject" bisa menjadi sampah yang dikumpulkan jika Anda dereferensi dengan
dan tidak ada referensi lain untuk objek ini.
Namun referensi dan variabel statis tetap ada selama program Anda berjalan.
sumber
null
akhirstatic block
adalah opsi yang layak. Dalam kasus saya, umur objek harus lebih lama dari blok statis. Akhir kegunaan objek itu tidak terlalu konkret; demikian pertanyaan saya tentang pemanfaatan pemulung.Saya pikir ini menjawab pertanyaan Anda - pada dasarnya tidak kecuali kelas tersebut berasal dari loader kelas khusus dan yang membongkar kelas.
sumber
Kuncinya di sini adalah Pengumpulan Sampah dari instance Kelas yaitu Objek. Instance ClassLoader, pada dasarnya, adalah Object. Jadi, jika objek Classloader tidak dikumpulkan sampahnya, semua referensinya yang disimpan di heap (yaitu, hal statis) hampir tidak akan pernah sampah dikumpulkan. Pengecualiannya adalah String pool.
Jadi sebelum Anda tiba-tiba memutuskan untuk melakukan
private static MyGiantClass myGiantObject = new MyGiantClass()
Berpikirlah dua kali seperti yang telah saya pelajari dengan cara yang sulit.sumber