On 8/20/2010 1:10 PM, Abu Azzam wrote:
Assalaamu'alaykum,
Salam kenal semuanya,
Seperti judul di atas, adakah cara untuk menghancurkan objek secara
eksplisit. Sebelumnya saya sudah mencari di internet terutama di
stackoverflo*.com dan yang saya tangkap hal ini tidak bisa dilakukan.
Meski kita bisa me-null kan objek atau finalize dan memanggil
System.gc() belum tentu sang garbage collector akan meng-collect saat
itu juga.
Yang mau saya tanyakan apakah memang tidak ada cara untuk
menghancurkan objek secara eksplisit?
Ada. Caranya sederhana kok. Rubah saja JVM nya. JVM kan sekarang ada
sourcenya
dan bisa dikompilasi ulang dari source jadi ya rubah saja JVMnya.
Rubah nya di mana? Di System.gc(). Hapus semua check-check yang
menyebabkan garbage collector belum tentu dipanggil.
Mungkin perlu saya sampaikan kenapa saya menginginkan hal ini. Jadi
saya membuat webapp untuk melakukan benchmark. Nah benchmark ini
dilakukan berulang-ulang eksekusinya untuk setiap "query"-nya. Saya
menginginkan tiap eksekusinya memiliki kondisi yang sama, yaitu masih
bersih tidak ada objek yang masih tereferensi dari eksekusi sebelumnya
supaya perlakuan tiap eksekusinya sama.
Ini nih yang aneh. Web app java secara alamiah memang long running
process dan
optimisasi pasti akan dilakukan oleh compiler Hot Spot sehingga waktu
eksekusi memang
akan makin cepat seiring dengan berjalannya proses optimisasi sehingga
mencapai
kecepatan optimal. Kecepatan optimal inilah yang harus diukur oleh
benchmark.
Bukan kecepatan pada awal proses dimana di compiler Hot Spot belum
mendapatkan
statistik yang cukup sehingga belum bisa menjalankan optimisasi.
Lagipula melakukan benchmark query database tapi yang dibenchmark Java
nya adalah tindakan
sia-sia yang nggak bermanfaat. Kenapa? Karena overhead Java kalau
aplikasinya sudah
benar adalah dibawah 10%. 90% waktu untuk menjalankan query habis di
dalam databasenya.
Jadi yang dioptimisasi harusnya querynya dan databasenya bukan aplikasi
Javanya.
Ataukah ada cara lain untuk mewujudkan ini? Tentunya selain dengan
merestart webserver.
Oh iya, saya punya alternatif cara dalam pemahaman saya yang masih
terbatas:
1. mengedit file .classnya dari objek supaya saat eksekusi selanjutnya
webserver me-reload context
2. menggunakan dynamic compiling dan dynamic class loading
Apa cara ini mungkin dilakukan? Soalnya saya kurang yakin dengan yang
dua alternatif yang saya tuliskan itu. Maklum newbie :)
2 cara diatas nggak bermanfaat. Begini. Kalau mau menyelesaikan masalah
performance maka cara yang benar bukan sekedar benchmark.
Cara yang benar adalah temukan akar masalah lambatnya aplikasi dan solve
diakar masalahnya.
Cara yang umum digunakan adalah profiling. Jadi aplikasi diinstrumentasi
pakai
profiler lalu di gunakan secara wajar oleh user dalam jangka waktu
tertentu.
Nanti akan terlihat lokasi-lokasi dalam aplikasi dimana aplikasi
berjalan lambat.
Lalu pusatkan perhatian pada lokasi-lokasi tersebut dan rubah algoritma
atau
tune database anda. Kalau tetap tidak berhasil baru pakai cara yang
lebih canggih
macam paralelisasi menggunakan multi-threading/messaging.