我有带有 top 命令的 Spring 应用程序,显示 Amazon EC2 小型实例(1.7 GB RAM)上的以下数据 -
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5019 ubuntu 20 0 1971m 446m 17m S 4.7 27.0 31:25.61 java
这只占用 446 MB 内存用于启动软件,我有大约 350 个类,并且有 Maven 作为依赖项引入的库。
free -m
total used free shared buffers cached
Mem: 1656 1642 14 0 34 519
-/+ buffers/cache: 1088 568
Swap: 895 12 883
Maven Spring 依赖项存在 -
Spring Core, Spring MVC, Spring Data , Spring Data Rest, , Spring
Security, Spring HATEOAS, Spring Boot, Spring Oauth , Spring-Vaadin
我将此内存占用与 jenkins 进行比较,后者总共占用 277 MB,但我的测试应用程序显然占用了 +400 MB,而没有显着运行任何内容。
此时代码只有实体和 Spring Data Rest。 我做了堆转储分析,它显示 hibernate 作为应用程序的最大消费者占用了 15 MB 的 PID(使用 jmap 获取)
Used heap dump 76.9 MB
Number of objects 1,785,039
Number of classes 12,546
Number of class loaders 245
Number of GC roots 2,589
Format hprof
MAT 中最大的顶级 Dominator 类加载器报告显示 -
org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf00f8bb0 - 45 MB - 56.91%
- Spring Web 应用程序通常仅需要 +400 MB 当以上库添加为依赖项并运行时启动 使用 mvn jetty:run ?
- 此处堆占用率由 jmap 显示为 77 MB,尽管 top 命令显示 +400 MB ,为什么它们不匹配,因为它们都具有相同的 PID 5019
最佳答案
很难仅根据库进行估计,因为它取决于您的 jvm 设置、您对应用程序做了什么、您的引导相关代码是否有效地使用了内存等?对于具有这些依赖项的应用程序来说,400mb 听起来很正常。
堆占用只是代码和库使用的内存部分。 jvm也需要内存才能运行。另外,您的操作系统在分配内存时可能有其自身的复杂性。
您可以尝试调整各种 jvm 堆内存设置(请参阅 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html )。一些非常常见的设置是 -Xmx -Xms -XX:MaxPermSize。
我的建议是使用一些 jvm 分析工具,为您提供堆使用情况图(例如:visualvm),确保堆消耗不会上升(寻找锯齿模式),然后您可以衡量您使用了多少需要调整VM参数。
关于java - Spring Web应用程序内存分析的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458531/