【发布时间】: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