Jadi saya melihat tumpukan dengan jmap di kotak jarak jauh dan saya ingin memaksa pengumpulan sampah di atasnya. Bagaimana Anda melakukan ini tanpa masuk ke jvisualvm atau jconsole dan teman-teman?
Saya tahu Anda seharusnya tidak melakukan praktik pengumpulan sampah secara paksa - Anda harus mencari tahu mengapa tumpukan itu besar / bertambah.
Saya juga menyadari System.GC () sebenarnya tidak memaksa pengumpulan sampah - itu hanya memberi tahu GC bahwa Anda ingin hal itu terjadi.
Apakah ada cara untuk melakukan ini dengan mudah? Beberapa aplikasi baris perintah yang saya lewatkan?
java
garbage-collection
jmx
jmap
eyberg
sumber
sumber
Jawaban:
Anda dapat melakukannya melalui program jmxterm gratis .
Nyalakan seperti ini:
Dari sana, Anda dapat terhubung ke host dan memicu GC:
Lihat dokumen di situs web jmxterm untuk informasi tentang menyematkannya di skrip bash / perl / ruby / lainnya. Saya telah menggunakan popen2 dengan Python atau open3 di Perl untuk melakukan ini.
UPDATE: inilah satu baris menggunakan jmxterm:
sumber
Sejak JDK 7 Anda dapat menggunakan alat perintah JDK 'jcmd' seperti:
jcmd <pid> GC.run
sumber
Explicit GC is disabled, no GC has been performed
, mungkin karena-XX:+DisableExplicitGC
argumen VM. Lihat: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Jika Anda menjalankan
jmap -histo:live <pid>
, itu akan memaksa GC penuh di heap sebelum mencetak apa pun.sumber
jcmd
sekarang alat yang tepat untuk pekerjaan itu.Selain user3198490 jawaban 's. Menjalankan perintah ini mungkin memberi Anda pesan kesalahan berikut:
Ini dapat diselesaikan dengan bantuan jawaban stackoverflow ini
di mana
<process_owner>
pengguna yang menjalankan proses dengan PID<pid>
. Anda bisa mendapatkan keduanya daritop
atauhtop
sumber
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, bisakah Anda mencoba? Perintah itu harus amanAda beberapa solusi lain (sudah banyak yang bagus di sini):
gc()
.gc()
operasi pada MemoryMBeanContoh berikut adalah untuk cmdline-jmxclient:
Ini bagus karena hanya satu baris dan Anda dapat memasukkannya ke dalam skrip dengan sangat mudah.
sumber
untuk linux:
jcmd
dikemas dengan JDK,$(pgrep java)
mendapatkan ID proses javasumber
Saya tidak berpikir ada opsi baris perintah untuk hal yang sama.
Anda perlu menggunakan jvisualvm / jconsole untuk hal yang sama.
Saya lebih menyarankan Anda untuk menggunakan alat ini untuk mengidentifikasi, mengapa program Anda memiliki memori tinggi.
Bagaimanapun Anda tidak boleh memaksa GC, karena akan mengganggu algoritma GC dan membuat program Anda lambat.
sumber
Jika Anda menggunakan jolokia dengan aplikasi Anda, Anda dapat memicu pengumpulan sampah dengan perintah ini:
sumber
hanya:
sumber