[英]Spring boot high memory usage after some time
我有一個部署在數字海洋上的 Spring Boot 應用程序,我當前的 Droplet(虛擬電腦,命名為 droplet)有 1GB 的內存。
我的應用程序有一些從某些 API 獲取信息並存儲在數據庫上的 cron 作業,我將解釋它:
@Scheduled(cron = "50 0 0/12 * * ?")
^ 這個從表中清除一些值
@Scheduled(cron = "50 0 0/1 * * ?")
^ 同上,但用於另一張桌子
@Scheduled(cron = "0 0/1 * * * ?")
^ 有兩個,從 API 獲取信息,做一些數學計算,然后將結果存儲在 db 上。
我從監控工具中看到的是,我的內存使用量永遠不會下降,它總是會上升一點。
大約 5 小時前,它從 40% 的使用率開始,現在是 75%。
我可以做些什么來清理內存使用情況? 也許是垃圾收集?
我使用 mysql,順便說一句
謝謝
-- 編輯
我只是運行visualvm,結果是顯示:
似乎 gc 實際上正在運行,所以,有什么問題嗎? 也許我需要在數字海洋中設置最大堆?
聽起來您有某種內存泄漏,我建議使用分析工具(例如免費的 VisualVM)來運行您的應用程序並嘗試確定內存泄漏的來源。
https://www.infoq.com/articles/java-profiling-with-open-source/
這可能是您的 Java 應用程序或數據庫查詢花費大量時間並將 DB 結果存儲在 Java 堆空間中的問題。
您需要一個更好的分析工具,它不僅可以說明堆的使用情況,還可以指出導致問題的代碼。
我個人非常喜歡Appdynamics ,因為它會在代碼的所有層中說明問題。 它還可以免費用於某些用途,並提供 SAAS 解決方案,並且非常易於集成。
請看一看,如果您需要更多信息,請告訴我。
您可以嘗試清理實體管理器,因為它會嘗試緩存您插入到數據庫中的內容。
entityManager.clear();
前段時間我在幾分鍾內導入了幾百萬條記錄時遇到了同樣的問題。 我在visualvm中得到了非常相似的結果。
因此,在每 10k 條記錄后,我清除了實體管理器,並且使用的內存不再增加。
實際上,應用程序資源對於開發人員和公司花一些錢來增加資源很有價值。所以,每個現代應用程序都需要以最少的內存使用后台工作。@Schedule 是 JVM 的昂貴注釋。我建議您不要使用此注釋使用Celery、Redis等TaskQueues。可以在Redis中Requeue任務,然后redis發布。對於大進程和后台進程非常有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.