我注意到 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
在监控 Spring Boot 应用程序后,我发现了一些可能的原因,例如:
- http 线程数(Undertow 每个线程启动大约 50 个线程)
默认,但您可以通过属性增加/减少所需的线程数量)
- 通过 JNI 访问本机例程(.dll、.so)
- 静态变量
- 使用缓存(memcache、ehcache 等)
- 如果虚拟机是 32 位或 64 位,64 位会使用更多内存来运行相同的应用程序,因此如果您不需要大于 1.5GB 的堆,那么请保持应用程序运行在 32 位以上以节省内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)