Mengatasi Memory Leak (Kebocoran Memori) di Java
Kebocoran memori atau memory leaking terkenal sulit untuk di-debug. Java, dengan pengumpul sampah bawaannya, menangani sebagian besar masalah kebocoran memori. Kebocoran memori sebenarnya terjadi ketika objek disimpan dalam memori tetapi tidak dapat diakses dengan menjalankan kode. Jenis objek yang tidak dapat diakses ini ditangani oleh pengumpul sampah Java (dalam banyak kasus). Jenis kebocoran memori lainnya terjadi ketika kita memiliki referensi yang tidak dibutuhkan ke suatu objek di suatu tempat. Ini bukan kebocoran memori yang sebenarnya karena objek masih dapat diakses, tetapi tidak kurang dapat menyebabkan beberapa bug jahat.
Misalnya, menyimpan objek besar dalam sesi dan tidak membersihkan referensinya. Masalah seperti ini sering kali tidak diperhatikan hingga kami mendapatkan banyak pengguna secara bersamaan dan aplikasi Anda mulai membuang kesalahan memori. Tanpa uji beban, ini kemungkinan besar akan terjadi dalam produksi.
Salah satu cara untuk menemukan kebocoran memori adalah dengan menganalisis tumpukan sampah (head dump). Ada beberapa cara untuk mendapatkan heap dump (tidak termasuk alat pihak ke-3):
1. HeapDumpOnCtrlBreak
Tambahkan opsi ini saat memulai JVM. Ini akan membuat heap dump setiap kali sinyal ctrl+break (kill -3) dikirim ke JVM. HeapDumpPath digunakan untuk mengatur lokasi heap dump.
2. HeapDumpOnOutOfMemoryError
Opsi JVM ini akan membuat heap dump setiap kali aplikasi Anda melontarkan OutOfMemoryError. HeapDumpPath digunakan untuk mengatur lokasi heap dump.
3. Jmap
Jmap adalah alat yang dilengkapi dengan instalasi JDK. Untuk menggunakannya kita memerlukan PID dari proses java kita. Kemudian kita bisa menggunakannya seperti ini:
Kita juga bisa menggunakan jmap dari kode kita. Untuk mendapatkan pid dari penggunaan kode, kita perlu menggunakan java.lang.management.ManagementFactory.
String pid = name.substring(0, name.indexOf("@"));
After that we can start jmap process like this:
String[] cmd = { "jmap", "-dump:file=D:tempheapdumpsdump.bin", pid }; Process p = Runtime.getRuntime().exec(cmd);
Opsi ini tersedia di Java 1.6+ dan menggunakan sun.management.ManagementFactory.