3

我们有一个处理相对大量数据的 Swing 应用程序。例如,我们目前处理包含数百万行数据的 CSV 文件。出于性能和简单性的原因,我们只是将所有数据保存在内存中。然而,不同的用户需要处理不同数量的数据以及不同数量的 RAM。在创建安装程序时,我们当然需要指定堆大小。是否有任何简单的方法可以让用户指定堆,而无需手动编辑配置或 .bat 文件?我猜并非所有用户都会对此感到满意。

我见过一个例子,其中一个应用程序指定了三个不同的快捷方式,每个快捷方式都指定了不同的内存量。这可以工作,但我想要一个更灵活的选项。然后,用户可以选择最适合他们的那个。

4

5 回答 5

6

我建议使用类似于 IntelliJ 的东西。当发生 OutOfMemoryException 时,它会弹出一个配置对话框。此对话框允许用户配置堆大小并将其存储到idea.exe.vmoptions. 您需要将文件的内容分到 java/javaw 启动命令中,或者让一个 Java 程序引导并启动真正的程序。

一个非常酷的变体是根据数据大小建议内存大小。用户确实无法知道您的程序需要多少内存,因此您在选择值时可以提供的任何指导都将极大地帮助他们。

在支持此解决方案时,您期望并以一种避免数据损坏的方式处理 OutOfMemoryExceptions,这一点非常重要!

于 2010-09-09T12:25:36.927 回答
1

我会写一个简短的startup.jar,从脚本开始只有很少的固定内存设置。反过来,startup.jar 将使用 Runtime.exec() 和调整的参数启动您的目标应用程序。

您最终会得到 2 个 JVM 实例,它们比仅一个 JVM 消耗更多的内存。但是,如果您的应用程序无论如何都会花费大量内存,那么第一个 JVM 就无关紧要了。

于 2010-09-09T12:29:36.007 回答
1

主要思想是这样的:

  • 通过类似于以下的 shell 脚本启动您的主应用程序:
@echo 关闭
设置本地
REM 从用户配置文件中读取 JVM 命令行选项
对于 /f %x in (%HOMEDRIVE%%HOMEPATH%\myapp.config) 设置 JVM_OPTIONS=%x
REM 重要:调用 javaw 而不是 java
javaw -jar myApp.jar %JVM_OPTIONS%
本地端
  • 在您的 Swing 应用程序中,有一个菜单选项Memory settings ...。当用户选择它时,解析用户的配置文件并填充设置对话框,以便用户可以更改任何适当的内容。当用户单击ApplyOk时,根据用户选择的 settigns(在您的情况下为-Xmx)使用命令行选项覆盖用户配置文件,并显示一条消息,例如Restart the application to apply these settings
于 2010-09-16T19:41:05.990 回答
1

捕获内存不足的异常,启动一个摆动用户对话框来设置内存限制,将此值传递给使用 Runtime.exec() 的线程使用 java -cp lib 的 jar vmoptions 重新启动应用程序,这将启动一个新的 jvm,其内存大小指定为用户样本:

 Runtime.getRuntime().exec("java -cp
 -Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar");
于 2010-09-21T09:14:54.193 回答
0

你没有提到你是如何创建安装程序的。如果您还没有使用它,我建议使用NSIS。文档很好,它有一个 eclipse 插件。您可以使用向导生成 nsi 文件,然后手动编辑它以获取向导不可用的选项。

至于您当前的要求,只需在安装程序中添加一个页面以获取选项,然后根据选择的选项,将正确的系统属性文件复制到可用于启动程序的用户设置文件夹中。我不确定它是否可能,但我认为一旦安装了程序,用户可以重新运行安装程序并选择不同的选项。

于 2010-09-09T12:29:07.770 回答