Launch4j:多个应用程序的 HeapPercent

Posted

技术标签:

【中文标题】Launch4j:多个应用程序的 HeapPercent【英文标题】:Launch4j: HeapPercent for multiple applications 【发布时间】:2020-10-15 17:46:14 【问题描述】:

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

maxHeapPercent = 50
maxHeapSize = 1024

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

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

【问题讨论】:

maxHeapSize 定义了一个上限,并不意味着“不少于”。所以你的应用程序永远不会超过 1GB maxHeapSize 中的“最大值”暗示,是的。然而,链接文档中的内容与引用的完全一致。 【参考方案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 位架构)

【讨论】:

以上是关于Launch4j:多个应用程序的 HeapPercent的主要内容,如果未能解决你的问题,请参考以下文章

无法运行 Launch4j(非法访问)

Win 7 pin 到任务栏 + launch4j + NSIS

尝试使用 Alakai 插件将 Launch4j 集成到 Maven 项目中

将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏

如何在 Gradle 中使用带有混淆 jar 的 Launch4J

jar转成exe