Rabu, Maret 06, 2019

JVM Shutdown Hook Pada Bahasa Pemrograman Java

Shotdown hook adalah konstruksi khusus yang memungkinkan pengembang untuk memasukkan beberapa bagian kode program untuk dieksekusi ketika JVM dimatikan. Kemampuan ini berguna pada kondisi dimana membutuhkan operasi pembersihan khusus ketika JVM akan dimatikan.

Penanganan ini membutuhkan beberapa pemahaman umum, seperti memastikan pemanggilan perintah  (pemanggilan System.exit(0)) tidak akan berfungsi apabila terjadi situasi dimana virtual machine sudah mati karena alasan lain (seperti perintah matikan yang berasal dari OS), atau disebabkan oleh masalah sumber daya (kehabisan memori). Shutdown hook memberikan penyelesaian masalah dengan mudah, dengan cara menyediakan blok kode arbitrari dimana kode tersebut semuanya akan dipanggil oleh JVM ketika JVM akan dimatikan.

Hal yang harus dilakukan untuk mengaktifkan shutdown hook adalah membuat class extends ke java.lang.Thread, dan membuat logika yang berisi perintah shotdown JVM di dalam method public void run(). Setelah itu, daftarkan register instance dari class shutdown hook ke JVM dengan cara memanggil method Runtime.retRuntime().addShutdownHook(Thread). Jika diperlukan penghapusan register shutdown hook sebelumnya, maka class Runtime menyediakan method removeShotdownHook(Thread).

Contoh program:

Ketika kode program diatas dijalankan, maka shutdown hook akan dipanggil oleh JVM ketika perintah pada main method telah dijalankan atau selesai dieksekusi.

Beberapa hal yang perlu diperhatikan dalam penggunaan perintah shutdown hook
satu, Dalam beberapa kondisi shutdown hook mungkin tidak dapat dieksekusi.
Satu hal yang perlu diingat adalah perintah shutdown hook tidak selamanya dapat dijalankan dalam program. Jika JVM mengalami kerusakan, maka kemungkinan kerusakan atau error tersebut tidak akan memberikan kesempatan untuk mengeksekusi perintah shutdown hook. Juga, jika O/S memberikan SIGKILL (googling saja!), maka aplikasi harus dimatikan lebih awal tanpa melakukan aktifitas pembersihan memori. Hal lain yang mungkin terjadi apabila JVM ingin dimatikan tanpa menggunakan perintah shutdown hook adalah menggunakan method Runime.halt().

Shutdown hook hanya akan dipanggil apabila aplikasi dimatikan secara normal atau apabila semua thread telah selesai dijalankan atau ketika memanggil perintah System.exit(0). Dan juga, JVM akan dimatikan bila disebabkan oleh kondisi eksternal seperti permintaan user untuk mematikan, ada sinyal SIGTERM dari O/S (atau perintah mematikan secara normal), atau operating system berhenti beroperasi.

dua, Saat perintah shutdown hook dipanggil, maka shutdown hook dapat berhenti beroperasi tanpa menyelesaikan eksekusi perintahnya.
Hal ini sama seperti kondisi khusus yang telah dijelaskan sebelumnya. Meskipun shutdown hook telah dijalankan perintahnya, bukan tidak mungkin proses eksekusi shutdown hook dapat terhenti ditengah jalan seperti ketika kondisi operating system yang mati atau berhenti beroperasi. Untuk kasus ini, O/S akan menunggu proses dimatikan untuk mengetahui jumlah waktu spesifik ketika SIGTERM dijalankan. Namun, jika proses belum dimatikan sesuai batas waktu yang diberikan, maka O/S akan mematikan proses secara paksa dengan mengeluarkan perintah SIGTERM (atau counterparts pada Windows). Jadi, kondisi ini mungkin saja terjadi jika perintah shutdown hook mati ketika perintah baru setengah jalan untuk dieksekusi.

Penting untuk memerhatikan bahwa perintah shutdown hook harus dibuat dengan hati-hati, memastikan agar perintah shutdown hook dapat dieksekusi secara cepat dan tidak menyebabkan situasi deadlock. Dan juga, JavaDoc khususnya mengingatkan bahwa perintah tersebut seharusnya tidak dijalankan pada bagian program yang membutuhkan proses kalkulasi panjang atau saat proses menunggu input I/O.

tiga, Aplikasi bisa memiliki lebih dari satu perintah shutdown hook, namun tidak dijamin apakah semua perintah dapat dieksekusi.
Method addShutdownHook dapat di-register lebih dari satu method pada aplikasi. Hanya saja tidak bisa dijamin apakah semua perintah tersebut dapat dieksekusi oleh JVM. JVM hanya bisa mengeksekusi shutdown hook dalam perintah arbiter. Lebih dari itu, JVM mungkin akan mengeksekusi semua perintah shutdown hook secara bersamaan.

empat, Tidak bisa membuat shotdown hook dalam shutdown hook.
Hanya ada satu rangkaian eksekusi shutdown hook pada JVM, tidak diizinkan menambahkan lebih dari satu perintah shutdown hook. Jika terdapat lebih dari satu shutdown hook maka JVM akan menganggapnya sebagai IllegalStateException.

lima, Ketika perintah shutdown hook dijalankan, perintah tersebut hanya bisa dihentikan dengan Runtime.halt().
Ketika rangkaian perintah shutdown hook telah dijalankan, hanya Runtime.halt() yang dapat menghentikan proses eksekusi secara paksa pada JVM dari rangkaian perintah eksekusi, kecuali ada faktor eksternal seperti SIGKILL. Artinya, pemanggilan perintah System.exit() di dalam shutdown hook tidak akan berfungsi. Hanya saja, jika pemanggilan System.exit() dilakukan dalam perintah shutdown hook, kemungkinan VM akan mengalami kemacetan dan terpaksa harus dimatikan secara paksa.

enam, Penggunaan shutdown hook memerlukan persyaratan izin keamanan.
Jika menggunakan Java Securityy managers, maka penambahan atau penghapusan perintah shutdown hook memerlukan izin runtime. Jika menghubungkan method tersebut tanpa melakukan permintaan izin pada security manager, maka method tersebut akan menghasilkan SecurityException.





Related Posts

JVM Shutdown Hook Pada Bahasa Pemrograman Java
Oleh

mohon untuk melakukan koreksi jika terdapat kesalahan pada penulisan blog ini,