java - Spring Web应用程序内存分析的疑惑

标签 java spring maven-jetty-plugin memory-profiling

我有带有 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%
  1. Spring Web 应用程序通常仅需要 +400 MB 当以上库添加为依赖项并运行时启动 使用 mvn jetty:run ?
  2. 此处堆占用率由 jmap 显示为 77 MB,尽管 top 命令显示 +400 MB ,为什么它们不匹配,因为它们都具有相同的 PID 5019

最佳答案

  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参数。

关于java - Spring Web应用程序内存分析的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458531/

相关文章:

java - MongoDB Java API : put() vs append()

java - Spring MVC 项目的可选 redis session 存储

java - JPA( hibernate ): Error when using @EmbeddedId in generic @MappedSuperclass

eclipse - 什么 maven-jetty-plugin 8 配置允许在 JSP 文件更改时重新加载它们?

log4j - BoneCP 不记录 SQL 语句

java - IntelliJ : Adding ALL Files to git repository

Javafx 组合框重置问题

java - 在独立应用程序中使用@Transactional

java - jetty 不启动

java - 制定每月周法