Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kebocoran Memori Java MySQL JDBC

Saya memiliki masalah yang sama persis. Saya perlu menjaga 1 koneksi tetap aktif untuk 3 utas dan pada saat yang sama setiap utas harus menjalankan banyak pernyataan (urutan 100k). Saya sangat berhati-hati dan saya menutup setiap pernyataan dan setiap hasil menggunakan try....finally... algoritma. Dengan cara ini, bahkan jika kode gagal dalam beberapa cara, pernyataan dan hasil selalu ditutup. Setelah menjalankan kode selama 8 jam, saya terkejut menemukan bahwa memori yang diperlukan berubah dari 35MB awal menjadi 500MB. Saya membuat dump memori dan saya menganalisisnya dengan Mat Analyzer dari Eclipse. Ternyata satu objek com.mysql.jdbc.JDBC4Connection mengambil memori 445MB untuk menjaga beberapa objek openStatements tetap hidup yang pada gilirannya tetap hidup di sekitar 135 ribu entri hashmap, mungkin dari semua hasil. Jadi tampaknya bahkan jika Anda menutup semua pernyataan dan kumpulan hasil Anda, jika Anda tidak menutup koneksi, itu membuat referensi ke mereka dan GarbageCollector tidak dapat membebaskan sumber daya.

Solusi saya :setelah lama mencari saya menemukan pernyataan ini dari orang-orang di MySQL:

"Pengujian cepat adalah menambahkan "dontTrackOpenResources=true " ke URL JDBC Anda. Jika kebocoran memori hilang, beberapa jalur kode di aplikasi Anda tidak menutup pernyataan dan kumpulan hasil."

Ini linknya:http://bugs.mysql.com/bug.php? id=5022 . Jadi saya mencobanya dan coba tebak? Setelah 8 jam saya membutuhkan sekitar 40MB memori, untuk operasi basis data yang sama. Mungkin kumpulan koneksi akan terlihat, tetapi jika itu bukan pilihan, ini adalah hal terbaik berikutnya yang saya temukan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara membuat beberapa halaman dengan dompdf

  2. mysql kiri luar bergabung

  3. perhitungan jarak dalam kueri mysql

  4. TIME() Contoh – MySQL

  5. Hapus dengan Gabung di MySQL