cru*_*usy 7 java memory out-of-memory launch4j
假设我有三个 Java 应用程序;A和B是 32 位,C是 64 位。所有这些都配置了
maxHeapPercent = 50
maxHeapSize = 1024
Run Code Online (Sandbox Code Playgroud)
根据文档,它读取“50% 的可用内存不少于 1024 MB” 。现在我的问题是,如果我在同一台机器上运行这些应用程序会发生什么?
A和B(作为 32 位应用程序!)每个只允许 4GB,使用 2GB?最终达到 2x2GB+1x8GB=12GB?还是 2x4GB+1x8GB=16GB,操作系统什么都没有?OutOfMemoryError? 或者它只会强制交换?(Java)应用程序堆的内存使用量只是应用程序所需内存的一部分。内存的其他典型用途是:
因此,除了崩溃之外,即使在应用程序被交换/调出到磁盘之前,也存在降低系统速度的巨大风险,但只是因为缺乏缓存。对于具有小堆的 Java,非常频繁的 Full GC 周期(扫描堆上的所有对象)会在抛出 OutOfMemoryError 之前很长时间减慢应用程序的速度。
如果您想亲自了解 MaxHeapSize 会变成什么,请尝试使用 PrintFlagsFinal 运行它,如下所示:
java -XX:+PrintFlagsFinal |find "MaxHeapSize"
在 Windows 或 Unices 上:
java -XX:+PrintFlagsFinal |grep "MaxHeapSize"。
也许您可以通过使用较小的堆栈大小甚至不同的 VM(IBM 捐赠的 Eclipse OpenJ9 或 GraalVM Native Image)来降低内存使用量,同时使应用程序启动更快,或者研究 CDS 和其他优化(尽管这不会)可以跨 32/64 位架构工作)