Artikel ini menganalisis alasan mengapa overflow memori program Java lebih rinci. Bagikan untuk semua orang untuk referensi Anda. Spesifiknya adalah sebagai berikut:
Ditemui sistem online yang dilaporkan Java.lang.outofmemoryError: Kesalahan ruang permgen, Anda perlu menemukan masalahnya. Saya mendapatkan ini sejak lama, dan saya benar -benar tidak ingat sekarang, tetapi ini benar -benar pertanyaan yang sangat menarik. Pertama -tama, reaksi pertama adalah menambahkan -xx:+printgcdetails parameter untuk melihat log GC spesifik, tetapi karena program ini dimulai oleh Tomcat, saya khawatir ada terlalu banyak hal yang diikat di dalamnya.
Lalu mari kita lihat penyebab kesalahan ini.
Nama lengkap Ruang Permgen adalah ruang generasi permanen, yang mengacu pada area pelestarian permanen memori Berbagai daerah heap. Tempat -tempat pra -rompile di JSP. Jika Anda menggunakan sejumlah besar toples ketiga di bawah aplikasi web Anda, ukurannya melebihi ukuran default (4m) dari JVM, maka pesan kesalahan ini akan dihasilkan.
Lalu mari kita tingkatkan ukuran memori awal Permgen:
Tambahkan di awal Linux di awal file catalina.sh: Salin kode kode sebagai berikut: java_opts = "-xms1024m -xmx1024m -xx: permsize = 256m -xx: maxpermsize = 256m" ""
Plus di awal file Catalina.bat di bawah Windows: Salin kode kode sebagai berikut: Setel java_opts = -xms1024m -xmx1024m -xx: permsize = 256m -xx: maxpermssize = 256m
Kemudian kami masih menggunakan memori visual untuk melihat alat untuk menemukan masalah tertentu. Alat yang disukai untuk JDK6 tentu saja adalah alatnya sendiri. Kali ini saya mengalami masalah aneh lainnya, yaitu, proses Tomcat tidak dapat ditemukan setelah alat analisis dibuka (JRE ditemukan dimulai setelah itu, dan seharusnya cukup untuk mengubahnya menjadi JDK).
Karena area lokal tidak diperbolehkan, saya dapat terhubung dari jarak jauh, cukup buka JMX.
Seperti halnya di atas, tambahkan kode kode salin ke awal file java_opts dari catalina.sh.sh atau catalina.bat sebagai berikut: -djava.rmi.server.hostname = 192.168.1.101 -Dcom.Management.jmxremote.port.port = 900 0-- dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false
Setelah memulai program, periksa apakah port dibuka dengan benar untuk memastikan bahwa remote dapat dihubungkan.
Saya malas di sini dan mematikan otentikasi. Pengaturan ini efektif pada PC lokal saya, tetapi tidak cukup di server. Buka JVisualVM, klik File-> Tambahkan koneksi JMX, lalu tambahkan LocalHost: 1000 dan hubungkan.
Setelah program sebelumnya, mengamati perubahan memori untuk jangka waktu tertentu, saya fokus pada situasi Perm. Mungkin ukuran memori Perm belum berlaku sebelumnya, karena inisialisasi default Perm adalah 16m dan maksimum adalah 64m, dan jumlah pekerjaan aktual memang dapat menyebabkan masalah ini. . Jika Anda perlu menemukan masalah lebih lanjut, Anda juga dapat menggunakan BTRACE untuk melihat tempat di mana metode tertentu dipanggil. Ini dapat memposisikan apakah metode tertentu dijalankan seperti yang diharapkan.
Diharapkan bahwa artikel ini bermanfaat untuk desain program Java semua orang.