我可以设置从 jar 文件运行的 Java 最大堆大小吗?

Posted

技术标签:

【中文标题】我可以设置从 jar 文件运行的 Java 最大堆大小吗?【英文标题】:Can I set Java max heap size for running from a jar file? 【发布时间】:2010-11-04 07:55:15 【问题描述】:

我正在启动一个 java jar 文件,它通常需要超过默认的 64MB 最大堆大小。不过,256MB 的堆大小对于这个应用程序来说已经足够了。无论如何指定(可能在清单中?)在启动 jar 时始终使用 256MB 的最大堆大小? (如果需要,下面会提供更具体的详细信息。)


这是我用 Java 编写的一个命令行应用程序,它可以进行一些图像处理。在高分辨率图像(大约 12 兆像素及以上,这并不罕见)上,我得到了 OutOfMemoryError。

目前我正在从 jar 文件启动应用程序,即

java -jar MyApp.jar params...

我可以通过在命令行上指定 256MB 最大堆大小来避免 OutOfMemoryError,即:

java -Xmx256m -jar MyApp.jar params...

但是,我不想指定这一点,因为我知道即使是高分辨率图像,256MB 也足够了。我想将该信息保存在 jar 文件中。这可能吗?

【问题讨论】:

简短的回答是否定的,您不能为 JAR 指定 JVM 参数。查看相关问题***.com/questions/193483 【参考方案1】:

编写包含以下行的批处理或 shell 脚本。放入存放MyApp.jar的文件夹中。

java -Xmx256M -jar MyApp.jar

之后始终打开此批处理/脚本文件以启动 JAR 文件。 虽然,这不会将虚拟内存大小的规范嵌入到 jar 文件本身中。但是,经常在命令行上编写相同的命令可以解决问题。

【讨论】:

实际上它确实回答了这个问题。不过,晚了四年。【参考方案2】:

您还可以使用launch4j 之类的包装器,它将为大多数操作系统生成可执行文件:es 并允许您指定 VM 选项。

【讨论】:

我喜欢这个,它也会去掉命令行的“java -jar”部分。 实际上,它并没有我想象的那么好。我没有mac,但我想从我的windows机器为我的jar文件构建一个mac可执行包装器。看起来这个应用程序并没有做到这一点...... 我将 jarbundler 用于我的 mac 应用程序 但是你可能需要一个 mac 来做这个【参考方案3】:

这不是很好,但你可以将它作为一个可执行的 JAR,然后在它的 main 中,让它通过命令行作为非守护线程执行自身,并将适当的参数存储在属性文件中或计算或其他,然后退出原始。您甚至可以让它使用另一个需要这些参数的“真实”入口点来执行 jar。

【讨论】:

【参考方案4】:

我有类似的需求,并认为我应该能够按照上面的建议在清单中指定它。但是,这是不可能的。我的解决方案与上面 Alex 建议的类似,但是,我所做的是让 main 方法使用 Java 的 ProcessBuilder 来启动另一个 Java 进程。启动另一个进程时,您可以指定新进程的最大内存。您实际上是在让一个 Java 进程启动另一个进程。这有点做作,但它确实有效,它仍然允许您通过双击 Jar 文件来启动您的应用程序,我知道您想要这样做。查看 ProcessBuilder。

【讨论】:

【参考方案5】:

在谷歌上找到an answer。

他对 JAR 文件说不,在 JavaWeb Start 中是的,并且您应该在您的(可能是系统特定的)启动器/包装器脚本/应用程序中执行此操作。

【讨论】:

【参考方案6】:

是的!您需要编写一个小型启动程序 - 我编写了一个小型的跨平台兼容(路径应该没问题)程序来做到这一点 - 见下文。这已经在 Windows/Ubuntu/Mac OS X 上进行了测试。

Silent Development Blog article on increasing executable Java jar heap

【讨论】:

【参考方案7】:

显然这适用于 Ubuntu

> export _JAVA_OPTIONS="-Xmx1g"

java -jar jconsole.jar & 拾取_JAVA_OPTIONS:-Xmx1g

【讨论】:

或 JAVA_TOOL_OPTIONS="-Xmx1g"【参考方案8】:

有很多方法可以做到:

您可以通过另一个 Jar 文件来触发您的主 Jar。

或者,有一个批处理文件将启动您的 jar。但请注意,如果从网络下载,用户必须设置脚本可运行的权限

构建安装程序。在 Mac 上,使用适用于 Java 7 的 Oracle Java App bundler,适用于 Java 6 的 Apple App bundler 构建 .app 文件。您仍然无法重新分发它,因为不会设置必要的权限。为应用程序文件构建一个 dmg。这可以用于分发。类似的 Windows 安装程序

第三种技术是最好的,因为您可以很好地打包依赖项,设置所有 JVM 参数等

【讨论】:

以上是关于我可以设置从 jar 文件运行的 Java 最大堆大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过环境变量设置 Java 的最小和最大堆大小?

大堆的 Java 速度较慢,没有过多的 gc-ing

Matlab 编译器 sdk 运行时

Linux里面JVM内存怎么设置?

运行jar文件前,我需要设置java虚拟机虚拟内存

将发布合并到一个 JAR 文件中的最简单方法