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 生成的报告类似,那么这就是您的代码的问题。
但是我必须声明,执行器的使用不是生产友好的,因为它本身具有显着的资源开销。
添加回答
举报