【问题标题】:Spring Boot memory consumption increases beyond -Xmx optionSpring Boot 内存消耗增加超出 -Xmx 选项
【发布时间】:2015-06-29 21:20:57
【问题描述】:

我注意到 Spring Boot 应用程序不遵守通过 Xmx 选项设置的内存量。 例如:java -Xss64m -Xmx64m -jar test.jar

我还在控制台上打印了应用程序在启动时实际使用的内存量,并显示: 最大内存:61M

long maxBytes = Runtime.getRuntime().maxMemory();
System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M");

当我在访问任何网页之前打开 Windows 进程时,它显示 +-105M,那么 Java 怎么会说 61M?

访问任何网页后,它会从 +-125M 变为 +-135M。为什么会有这样的增长?它应该给出“java.lang.OutOfMemoryError: PermGen space”,但不要以这种方式增加。

这让我很担心,如果许多应用程序可能会在服务器上耗尽内存。顺便说一句,我使用的是 Java 1.8_45

【问题讨论】:

  • 您应该阅读有关 java 内存模型的信息,尤其是有关 JRE 8 中的更改。Xmx 指定堆大小,而不是 PermGen。在 Java 8 中,PermGen 会在必要时动态增加。此外,程序实际使用的内存和被操作系统阻塞的内存可能不同。
  • 好的,但是 PermGen 超越了 Xmx 吗?我无法在 JVM 8 中设置 PermGen max
  • 正如我所说,使用 Xmx 可以设置堆空间的最大大小,这完全独立于 permgen 空间。在 Java 8 中,permgen 实际上被移除并被 MetaSpace 取代,它直接从本机内存分配所需的空间。但是,有一个选项,您可以在其中设置 MetaSpace 的最大大小。有关更多信息,请参阅本文:java.dzone.com/articles/java-8-permgen-metaspace

标签: java spring spring-boot


【解决方案1】:

在监控了Spring Boot应用之后,我发现了一些可能的原因如:

  1. http 线程数(Undertow 开始时每个线程大约 50 个线程) 默认,但您可以通过属性增加/减少所需的线程数量)
  2. 通过 JNI 访问本机例程(.dll、.so)
  3. 静态变量
  4. 使用缓存(memcache、ehcache 等)
  5. 如果 VM 是 32 位或 64 位,64 位会使用更多内存来运行相同的应用程序,因此如果您不需要大于 1.5GB 的堆,那么请让您的应用程序在 32 位以上运行以节省内存。

【讨论】:

  • 64位java使用压缩指针(如果你使用小于32GB的xmx),所以它不应该使用更多的内存来运行同一个应用程序?
猜你喜欢
  • 2018-07-25
  • 2018-05-05
  • 2019-01-16
  • 2011-12-21
  • 2020-01-06
  • 1970-01-01
  • 2021-03-10
  • 2016-05-03
  • 2021-03-29
相关资源
最近更新 更多