Saya sangat akrab dengan konsep objek pooling dan saya selalu berusaha menggunakannya sebanyak mungkin.
Selain itu saya selalu berpikir bahwa penyatuan objek adalah norma standar seperti yang saya amati bahwa Java itu sendiri serta kerangka kerja lainnya menggunakan penyatuan sebanyak mungkin.
Baru-baru ini saya membaca sesuatu yang sama sekali baru (dan kontra-intuitif?) Bagi saya.
Pooling itu sebenarnya membuat kinerja program lebih buruk terutama dalam aplikasi bersamaan, dan disarankan untuk instantiate new
objek sebagai gantinya, karena dalam JVM yang lebih baru, instantiasi objek sangat cepat.
Saya membaca ini di buku: Java Concurrency in Practice
Sekarang saya mulai berpikir jika saya salah memahami sesuatu di sini sejak bagian pertama buku ini disarankan untuk menggunakan Executors
kembali Thread
itu daripada membuat contoh baru.
Jadi, apakah pengumpulan objek telah menjadi usang saat ini?
sumber
Jawaban atas pertanyaan konkret: 'Apakah objek menggabungkan teknik yang sudah usang?' aku s:
Tidak. Objek pooling banyak digunakan di tempat-tempat tertentu - pooling thread, pooling koneksi database, dll.
Pembuatan objek umum tidak pernah menjadi proses yang lambat. Pooling itu sendiri menghabiskan sumber daya - memori dan kekuatan pemrosesan. Optimalisasi apa pun adalah kompromi.
Aturannya adalah:
Optimalisasi Prematur Jahat !!!
Tetapi kapan optimasi yang diberikan prematur?
Optimalisasi prematur adalah setiap optimasi yang dilakukan, sebelum Anda menemukan hambatan melalui profil menyeluruh .
sumber
Dalam situasi di mana Anda ingin menghindari pengumpulan sampah sepenuhnya, saya pikir pengumpulan objek adalah satu-satunya alternatif yang layak. Jadi tidak, itu sama sekali bukan teknik usang.
sumber
Mengukur
Ini sepenuhnya tergantung pada kasus penggunaan Anda, ukuran objek Anda, JVM Anda, opsi JVM Anda, GC apa yang telah Anda aktifkan dan sejumlah faktor lainnya.
Singkatnya: mengukur sebelum dan mengukur sesudahnya. Dengan asumsi Anda menggunakan kerangka kerja penyatuan objek (seperti dari Apache) maka tidak boleh terlalu menyakitkan untuk bertukar di antara implementasi.
Tip pengujian kinerja ekstra - biarkan JVM melakukan pemanasan sedikit lebih dulu, jalankan pengujian pada JVM yang sedang berjalan beberapa kali, ini dapat berperilaku berbeda.
sumber
Tergantung pada konteksnya.
sumber
Saya tidak tahu apakah ada tren yang berubah di sini tetapi pasti akan menjadi kasus yang tergantung . Jika kelas Java Anda mengelola sumber daya eksternal, seperti koneksi RMI atau memuat file sumber daya dll - maka tentu saja biaya untuk instance objek masih bisa tinggi (meskipun sumber daya tersebut mungkin sudah dikumpulkan untuk Anda!). Sebagai praktik umum, saya setuju dengan buku itu.
sumber