[ HTML ] [ Java ] [ Bahasa C ]


Senin, Mei 03, 2021

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 pada bahasa pemrograman Java.

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 1:

/* JVM shutdown hook pada bahasa pemrograman Java */

public class ShutDownHook

{

 

public static void main(String[] args)

{

 

Runtime.getRuntime().addShutdownHook(new Thread(){

public void run(){

System.out.println("Shutdown Hook dijalankan!");}

});

System.out.println("Aplikasi dimatikan ...");

 

}

}

Output:
Aplikasi dimatikan ...
Shutdown Hook dijalankan!

Contoh 2:

/* JVM Shotdown Hook pada bahasa pemrograman Java */

class ThreadChild extends Thread {

 

public void run() {

System.out.println("Membersihkan kode program");

System.out.println("Melakukan shutdown hook");

}

 

}

 

 

class Demo {

 

public static void main(String[] args) {

Runtime current = Runtime.getRuntime();

current.addShutdownHook(new ThreadChild());

for(int i = 1; i <= 10; i++)

System.out.println("2 X " + i + " = " + 2 * i);

}

 

}

Output:
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18
2 X 10 = 20
Membersihkan kode program
Melakukan shutdown hook

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 menjalankan perintahnya, bukan tidak mungkin proses eksekusi shutdown hook dapat terhenti ditengah jalan seperti ketika kondisi operating system yang mati atau berhenti beroperasi pada saat pengoperasian. 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). 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, Shutdown hook dapat memiliki lebih dari satu perintah dalam proses pengoperasiannya, namun tidak dapat menjamin apakah semua perintah tersebut dapat dieksekusi semua.
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 mesin virtual akan mengalami kemacetan dan terpaksa harus dimatikan secara paksa.

enam, Penggunaan shutdown hook memerlukan persyaratan izin keamanan.
Jika komputer 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.

5 komentar:

  1. Apa yang dimaksud dengan shutdown hook pada bahasa pemrograman Java?

    BalasHapus
    Balasan
    1. Shutdown Hook pada Java secara sederhanya adalah sebuah utas yang diinisialisasi tetapi belum dimulai pada thread. Ketika JVM memulai urutan shutdown, proses tersebut akan memulai semua hook shutdown hook yang terdaftar dalam beberapa urutan yang tidak ditentukan dan akan membiarkannya berjalan secara bersamaan.

      Hapus
  2. Dalam bahasa pemrograman Java programmer dapat membuat shutdown hook pada program yang dikembangkannya, dimana programmer dapat membuat suatu thread baru dan memberikan logika yang dapat dijalankan ketika JVM akan dimatikan. Kemudian programmer juga dapat mendaftarkan clss instance thrread sebagai shutdown hook ke mesin virtual atau JVM menggunakan Runtime.getRuntime().

    BalasHapus
  3. Apa yang dimaksud dengan hook pada bahasa pemrograman Java?

    BalasHapus
    Balasan
    1. Hook dalam bahasa pemrograman Java adalah suatu method dari potongan kode progan yang diletakkan didepan potongan kode program lainnya, sehingga potongan kode program pertama akan dieksekusi sebelum potongan kedua dieksekusi, dan sekaligus memberikan potongan kode program pertama kesempatan untuk melakukan pemantauan atau penyarikan dari behavior-nya dari potongan kode program ke dua pada Java.

      Hapus

Respon komentar 7 x 24 jam, so please be patient :D