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.

Kirim email ke