使用依赖硬件的VM参数(重新)启动Java应用程序的正确方法?

使用依赖硬件的VM参数(重新)启动Java应用程序的正确方法?,java,parameters,jvm,Java,Parameters,Jvm,编辑我不想使用Java Web Start 我有一个Java应用程序,我希望根据启动它的系统的内存量使用不同的VM参数来运行它 例如,如果机器的内存为1GB或更少,我希望在内存为2GB时通过“-Xmx200m”和“-Xmx400m”,在内存为8GB时通过“-Xmx800m”(这些只是示例) 有没有一种便携的方法可以做到这一点 我曾经尝试过第一个微型Java应用程序(因此是可移植的),它可以确定可用的内存量,然后启动一个新的Java应用程序,但我认为这不是很干净 到目前为止,我已经编写了bashs

编辑我不想使用Java Web Start

我有一个Java应用程序,我希望根据启动它的系统的内存量使用不同的VM参数来运行它

例如,如果机器的内存为1GB或更少,我希望在内存为2GB时通过“-Xmx200m”和“-Xmx400m”,在内存为8GB时通过“-Xmx800m”(这些只是示例)

有没有一种便携的方法可以做到这一点

我曾经尝试过第一个微型Java应用程序(因此是可移植的),它可以确定可用的内存量,然后启动一个新的Java应用程序,但我认为这不是很干净

到目前为止,我已经编写了bashshell脚本,这些脚本根据配置使用正确的参数调用Java应用程序,但它只在Linux和osx上工作

解决这个问题的正确方法是什么


应用程序打包程序包;)帮助?

定义我将使用JNLP的各种启动配置。可以在那里指定xmx


不幸的是,这仍然让您需要找出系统有多少内存,您的微型Java应用程序听起来最适合这些内存。

与您现有的解决方案一样,我使用脚本来启动应用程序,但我使用Python而不是Bash。Python在大多数Linux发行版和OSX上都有发布。唯一的困难是Windows,但您可以建议将Python作为与安装JVM类似的先决条件

您确定要这样做吗?一般来说,Java应用程序需要一定量的内存,而不是更多,也不是更少

如果您有一台内存很少的机器,并且在-Xmx处指定了一个较小的数字,那么您就有可能内存不足

如果您有一台具有大量内存的机器,并且指定了大量内存,那么应用程序将不会使用所有内存,而只使用正在使用的对象所需的内存量

因此,一般来说,在-Xmx处指定大的数字不会丢失内存


(例外情况是服务器应用程序具有大量的对象“吞吐量”,并且往往会浪费内存。)

您对当前的方法有何不满?它是完全可移植的(与各种脚本解决方案不同……为什么脚本比100%可移植字节码更“干净?”),而且如果硬件在安装后发生变化,它将完全适应(因此它比将硬件细节作为安装脚本的一部分捕获要好)

如果你能解释实际问题,那么就更容易找到解决这些具体问题的方法

实际上,这里有一个你可能更喜欢的替代方案:复制Photoshop、GIMP等的功能,并将“资源使用”或“性能”作为应用程序首选项的一部分。当/如果他们更改此设置时,您必须提示他们重新启动您的应用程序(使用修改后的启动过程重新启动您的应用程序,因为您无法更改正在运行的应用程序的内存限制…写入新标志取决于部署方法),但对于他们可能只更改一次的设置来说,这并不是灾难

您还可以在第一次运行时检查他们的硬件,如果您的默认安装设置与他们的设置相差很远,则提示他们更改设置。

因为:

  • 是一个java程序
  • 具有内置的分叉/启动机制
  • 具有脚本基础知识
  • 可嵌入到另一个程序中
  • 具有处理环境/配置问题的命令行解析和其他基本功能
  • 我建议你

  • 创建build.xml(或以编程方式创建目标/任务)
  • 让您的初始程序运行build.xml脚本

  • 对于任何“配置任务”,我建议使用真正强大和免费的packager。您还可以看看eclipse,在eclipse中,他们实现了重新启动java应用程序。

    在应用程序包中使用bash脚本而不是JavaApplicationStub可以更改参数。但是,这破坏了handleOpenFile()的功能:事件信号永远不会到达handleOpenFile ApplicationEvent事件。请参见

    在我们重新发明JNLP/WebStart之前,您是否可以详细说明您不想使用它的原因?@Joachim Sauer:JWS是一个绝对不能使用的问题。特别是如果您碰巧编写了销售给OS X用户的商业软件:Java在OS X上的声誉非常差,只要提到它是用Java编写的,就意味着巨大的销售损失。除此之外,苹果公司关于Java应用程序打包的官方指导方针还规定,将Java应用程序打包到.dmg中。换句话说,JWS是一个巨大的禁忌。比如说,为什么JWS没有附带IntelliJ想法是一个可以问自己的好问题。根据我的经验,JWS只提供“pet应用程序”。举出JWS附带的一个优秀应用程序?是的,我确定我想这样做。例如,当Photoshop在一台有20GB内存的机器上运行时,用户希望应用程序在Photoshop的情况下(在我的情况下)使用更多内存,这是有原因的。“一般”不是“在Photoshop中”,也不是“在促使我提出这个问题的情况下:)有无数类型的应用程序,在具有更多内存的系统上使用更多内存是有意义的。我的正好是其中之一,-Xmx参数并不配置应用程序应该使用多少内存,而是配置允许使用多少内存。它实际使用多少取决于您的应用程序逻辑(它创建了多少对象)。使-Xmx依赖于计算机可用内存的唯一效果是在小型计算机上获得OutOfMemoryError,但它不会使应用程序在大型计算机上使用更多内存。您坚持不获取它。为了详尽起见,我同时设置了-Xms和-Xmx,但感谢您的学究风度。在小型机器上设置一个-Xmx较小值的全部目的是为了不获得OOM。哦,顺便说一句,在运行时,我的应用程序会根据可用内存量进行自我调整。