【问题标题】:Can I set Java max heap size for running from a jar file?我可以设置从 jar 文件运行的 Java 最大堆大小吗?
【发布时间】: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 文件中。这可能吗?

【问题讨论】:

标签: java memory-management jar


【解决方案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 参数等

          【讨论】:

            猜你喜欢
            • 2011-11-24
            • 1970-01-01
            • 2011-06-14
            • 1970-01-01
            • 2016-04-16
            • 1970-01-01
            • 2021-10-29
            • 2011-03-29
            • 2018-04-14
            相关资源
            最近更新 更多