簡體   English   中英

一段時間后,Spring Boot 內存使用率高

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM