我可以设置从 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 最大堆大小吗?的主要内容,如果未能解决你的问题,请参考以下文章