Launch4j:多个应用程序的 HeapPercent
Posted
技术标签:
【中文标题】Launch4j:多个应用程序的 HeapPercent【英文标题】:Launch4j: HeapPercent for multiple applications 【发布时间】:2020-10-15 17:46:14 【问题描述】:假设我有三个 Java 应用程序; A
和 B
是 32 位,C
是 64 位。他们都配置了
maxHeapPercent = 50
maxHeapSize = 1024
根据documentation,它读取“50% 的可用内存不少于 1024 MB”。现在我的问题是,如果我在同一台机器上运行这些应用程序会发生什么?
-
假设机器有 16GB RAM,那些“50%”加起来会不会是 3x8GB=24GB,这超出了可用范围?
或者
A
和B
(是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的主要内容,如果未能解决你的问题,请参考以下文章
Win 7 pin 到任务栏 + launch4j + NSIS
尝试使用 Alakai 插件将 Launch4j 集成到 Maven 项目中
将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏