3 回答

TA貢獻1776條經驗 獲得超12個贊
您可以通過使用諸如visualvm 或jprofiler 之類的分析器來解決此問題,它們會向您顯示分配了內存的位置(哪些類型的對象等)。
如果可能,您不應該在生產系統上使用它,因為分析可能會占用大量 CPU。

TA貢獻1865條經驗 獲得超7個贊
了解我過去使用過的更多信息的另一種方法是使用AspectJ 的加載時間編織來添加特殊代碼,將內存信息添加到您的日志文件中。這也會減慢您的系統速度,但是當您的方面已經被寫入時,不如使用配置文件。
如果可能的話,分析將是首選 - 如果不是,AspectJ 加載時間編織可能會有所幫助。

TA貢獻1780條經驗 獲得超5個贊
您可以嘗試啟用執行器并將內存消耗值與 docker stats 生成的值進行比較。
要啟用執行器,您可以在 pom.xml 文件中添加以下依賴項。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
我通常使用 HAL 瀏覽器來監控應用程序并使用執行器端點。您可以使用以下 maven 依賴項添加它。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>
在 HAL 瀏覽器中,您可以嘗試使用/metrics應用程序的端點。
示例輸出如下所示。
{
"mem" : 193024,
"mem.free" : 87693,
"processors" : 4,
"instance.uptime" : 305027,
"uptime" : 307077,
"systemload.average" : 0.11,
"heap.committed" : 193024,
"heap.init" : 124928,
"heap.used" : 105330,
"heap" : 1764352,
"threads.peak" : 22,
"threads.daemon" : 19,
"threads" : 22,
"classes" : 5819,
"classes.loaded" : 5819,
"classes.unloaded" : 0,
"gc.ps_scavenge.count" : 7,
"gc.ps_scavenge.time" : 54,
"gc.ps_marksweep.count" : 1,
"gc.ps_marksweep.time" : 44,
"httpsessions.max" : -1,
"httpsessions.active" : 0,
"counter.status.200.root" : 1,
"gauge.response.root" : 37.0
}
通過這種方式,您可以監控應用程序的內存性能并了解應用程序實際消耗了多少內存。如果這與 docker 生成的報告類似,那么這就是您的代碼的問題。
但是我必須聲明,執行器的使用不是生產友好的,因為它本身具有顯著的資源開銷。
添加回答
舉報