2014-10-20 60 views
0

我有Spring应用与顶部命令表示接着在Amazon EC2上的小实例(1.7 GB RAM)的数据 -Spring的web应用程序内存分析怀疑

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 

我这个内存占用比较詹金斯是采取277 MB总,但我的测试应用程序显然需要+400 MB没有显著运行任何东西。

此时代码只有Entities和Spring Data Rest。 我做了一个堆转储分析,这表明休眠了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节目最大的顶级霸主类加载器的报告 -

org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf00f8bb0 - 45 MB - 56.91% 
  1. 请问一般Spring Web应用程序采取+400 MB只是 以上时库添加为依赖启动和使用命令mvn码头运行 :运行?
  2. 这里堆占用由JMAP虽然top命令显示为77 MB显示+400 MB,为什么他们不匹配,因为它们都是相同的PID 5019

回答

2
  1. 很难估计基于在图书馆里,因为它取决于你的jvm设置,你对你的应用程序做了什么,你的引导相关代码是否有效地使用了内存等?对于具有这些依赖性的应用程序,400mb听起来很正常。

  2. 堆占用率只是您的代码和库所使用的内存部分。 jvm也需要记忆才能运行。另外你的操作系统在分配内存时可能有其自己的复杂性。

您可以尝试调整各种jvm堆内存设置(请参阅http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)。一些相当常见的设置是-Xmx -Xms -XX:MaxPermSize。

我的建议是使用一些jvm分析工具,为您提供一个堆使用图(例如:visualvm),确保堆消耗不会爬起来(寻找锯齿图案),然后您可以评估多少您需要并调整VM参数。