Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

WBOY
WBOYke hadapan
2023-05-16 12:31:111426semak imbas

Sistem Masalah

Pemeriksaan harian mendapati gc penuh yang kerap

muncul pada talian permohonan

Gc penuh yang kerap

Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normalAnalisis fail dump:

a didapati bahawa sebilangan besar tatasusunan[] yang panjang menduduki ruang maksimum, dan terdapat pengecualian

<. . c. semak bilangan contoh histogram sebenarnya terdapat berbanding dengan timbunan projek biasa ia adalah kira-kira kali>

d episod. Saya pernah menggunakan analisis mat pada mulanya, namun laporan yang dihasilkan oleh mat lebih berguna untuk menganalisis kebocoran. Ia tidak berguna seperti jvisualvm.exe dan profiler idea untuk menganalisis memori yang tidak normal. sebab


Mulakan secara setempat dan menghasilkan semula jenis Penggunaan memori ini, jadi saya memulakan perkhidmatan tempatan dengan memori biasa dan aplikasi bermasalah, dan menganalisis perbandingan memoriBagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

Profil idea digunakan di sini, yang sangat mudah

Temui perbezaan:

Berbanding dengan aplikasi biasa, didapati rujukan aplikasi abnormal mempunyai rujukan abnormal daripada


Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

● rx.internal.operators.OnSubscribeReduceSeed$ReduceSeedSubscriber Saya mengesyaki inilah rujukan yang tidak normal adalah punca kejadian ini tidak boleh dikitar semula dalam generasi baharu tetapi terkumpul dalam generasi lama dan mencetuskan gc penuh.

Perbezaan penyelesaian masalah:

Melihat secara ringkas kod yang berkaitan, tetapi saya tidak dapat melihat sebab perbandingan nyahpepijat langsung

Sistem sememangnya telah memasukkan kod yang berkaitan dan menambah rujukan kepada Histogram, manakala aplikasi biasa tidak


tetapi anda tidak dapat mengetahui sebabnya hanya dengan melihatnya Pada masa ini, saya memberi perhatian kepada kumpulan benang dalam sudut kiri bawah. Kumpulan benang ini adalah kumpulan benang Metrik Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal Metrik digunakan oleh Hystrix untuk mengira penunjuk yang berkaitan untuk papan pemuka atau penggunanya sendiri, untuk memahami Fungsi pemutus litar parameter dan penunjuk
Melihat tindanan sekali lagi, logik untuk sampai ke sini ialah tatasusunan panjang Histogram melaksanakan kesan seperti tetingkap gelongsor untuk mengira penunjuk dalam satu unit masaBagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normalHistogram sendiri digunakan oleh Hystrix untuk melaksanakan fungsi yang serupa dengan baldi + tetingkap gelongsor untuk mengira trafik dalam masa unit Walau bagaimanapun, kerana parameter penunjuk dihidupkan, ia menyebabkan Untuk mengira penunjuk dalam julat masa yang lebih panjang, hystrix telah menambah objek baharu yang memegang lebih banyak rujukan Histogram (unit masa. ) untuk pengagregatan. Oleh kerana rujukan ini digunakan untuk mengira tempoh julat masa yang lebih lama, ia akan dipengaruhi oleh masa penahanan rujukan itu mencapai usia tua, tetapi intipatinya bukanlah kebocoran memori, jadi ia boleh dikitar semula selepas setiap gc penuh.

Selesaikan masalah

Lihat perbezaan di atas dan kumpulan benang yang pelik, pertama Reaksinya adalah untuk mematikan metrik supaya aplikasi tidak menambah rujukan kepada logik ini mengikut dokumentasi rasmi , konfigurasi ini dihidupkan secara lalai, dan sahkan bahawa fungsi ini hanya mempengaruhi statistik penunjuk dan tidak menjejaskan fungsi pemutus litar itu sendiri Gunakan konfigurasi hystrix.metrics.enabled= konfigurasi palsu untuk menutup

Selepas menambah konfigurasi. , sahkan dan lihat timbunan, rujukan kembali kepada normal, dan sistem tidak menambah lebih banyak contoh Histogram selepas tempoh masa selepas mengeluarkannya dalam talian dan memerhatikannya untuk satu tempoh masa, masalah gc penuh memang telah diselesaikan

Punca Punca


Selepas menemui penyelesaian dan mengesahkannya pada masa itu, saya tidak sempat mengkaji sebab konfigurasi lalai hystrix.metrics.enabled adalah benar tetapi aplikasi lain tidak mempunyai masalah gc penuh ini, selesaikan dahulu, dan kemudian teruskan tindakan susulan untuk menyiasat punca utama untuk mengelakkan masalah yang sama daripada berlaku dalam projek lain Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

Kumpulan benang yang mencurigakan yang ditemui sebelum ini ialah HystrixMetricsPoller pemeriksaan, kumpulan benang terdiri daripada HystrixMetricsPollerConfiguration



didayakan, terutamanya bergantung pada hystrix.metrics.enabled, tetapi lalainya adalah benar projek tidak didayakan?

Selepas mencari kod sumber, pembukaan kelas ini berkaitan dengan anotasi


Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

Selepas membandingkan kod, ternyata hanya aplikasi yang tidak normal gunakan anotasi ini. Tujuan anotasi ini adalah untuk menghidupkan pemutus litar

Walau bagaimanapun, selepas penyelidikan, didapati tanpa menggunakan anotasi ini, fungsi seperti pemutus litar masih tersedia versi spring-cloud, spring menggunakan hystrix untuk merangkum openfeign Daripada menyepadukan keseluruhan sistem hystrix, spring-cloud mungkin juga menemui masalah dengan penggunaan memori hystrix

Jadi dalam versi yang lebih tinggi (sekurang-kurangnya versi kami), feign dihidupkan dan dimatikan melalui pemutus Litar feign.hystrix.enabled (jika suis ini dimatikan, hanya menambah anotasi @EnableCircuitBreaker pada pemutus litar tidak akan berkuat kuasa)

Malah, dalam versi yang lebih tinggi spring-cloud, anotasi @EnableCircuitBreaker telah ditandakan sebagai usang Walau bagaimanapun, ini mungkin kerana kami adalah versi pertengahan, jadi terdapat situasi di mana ia tidak ditandakan sebagai usang tetapi sebenarnya tidak berguna

Dalam. pendek, fungsi pemutus litar feign hanya dikawal oleh feign.hystrix.enabled, selepas menambah anotasi @EnableCircuitBreaker Ia hanya akan mendayakan semua penunjuk lain dan fungsi lain Hystrix


Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah gc penuh yang kerap disebabkan penggunaan memori Java yang tidak normal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam