Launch4j:多个应用程序的 HeapPercent

cru*_*usy 7 java memory out-of-memory launch4j

假设我有三个 Java 应用程序;AB是 32 位,C是 64 位。所有这些都配置了

maxHeapPercent = 50
maxHeapSize = 1024
Run Code Online (Sandbox Code Playgroud)

根据文档,它读取“50% 的可用内存不少于 1024 MB” 。现在我的问题是,如果我在同一台机器上运行这些应用程序会发生什么?

  1. 假设机器有 16GB RAM,那些“50%”加起来会是 3x8GB=24GB,这是否超过可用?
  2. 或者做AB(作为 32 位应用程序!)每个只允许 4GB,使用 2GB?最终达到 2x2GB+1x8GB=12GB?还是 2x4GB+1x8GB=16GB,操作系统什么都没有?
  3. 这是否会导致崩溃和/或OutOfMemoryError? 或者它只会强制交换?

Joh*_*esB 1

(Java)应用程序堆的内存使用量只是应用程序所需内存的一部分。内存的其他典型用途是:

  • 每个应用程序线程的堆栈内存
  • 应用程序代码、(共享)库
  • 操作系统用途,包括可以避免重复磁盘 I/O 的缓存
  • 对于 Java:本机内存,例如用于本机实现的函数,如 ZIP

因此,除了崩溃之外,即使在应用程序被交换/调出到磁盘之前,也存在降低系统速度的巨大风险,但只是因为缺乏缓存。对于具有小堆的 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 位架构工作)