如何让用户轻松选择在JavaSwing应用程序中分配多少内存?

如何让用户轻松选择在JavaSwing应用程序中分配多少内存?,java,size,heap,large-data-volumes,Java,Size,Heap,Large Data Volumes,我们有一个Swing应用程序,可以处理相对大量的数据。例如,我们目前正在处理包含数百万行数据的CSV文件。出于性能和简单性的考虑,我们只是将所有数据保留在内存中。然而,不同的用户需要处理不同数量的数据,以及不同数量的RAM。在创建安装程序时,我们当然需要指定堆大小。有没有简单的方法允许用户指定堆,而无需手动编辑配置或.bat文件?我猜并不是所有的用户都会对此感到满意 我见过一个例子,其中一个应用程序指定了三个不同的快捷方式,每个快捷方式都指定了不同的内存量。这可能会奏效,但我希望有一个更灵活的选

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


我见过一个例子,其中一个应用程序指定了三个不同的快捷方式,每个快捷方式都指定了不同的内存量。这可能会奏效,但我希望有一个更灵活的选择。然后用户可以选择最适合他们的产品。

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

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


在支持此解决方案时,以避免数据损坏的方式期望和处理OutOfMemoryException是非常重要的

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


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

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


最终会出现两个JVM实例,它们的内存消耗量超过一个JVM。但是,如果您的应用程序将花费大量内存,那么第一个JVM并不重要。

主要思想是:

  • 通过与以下类似的shell脚本启动主应用程序:
@回音 setlocal REM从用户配置文件中读取JVM命令行选项 对于(%HOMEDRIVE%%HOMEPATH%\myapp.config)中的/f%x,请设置JVM\u选项=%x REM要点:调用javaw而不是java javaw-jar myApp.jar%JVM\u选项% 端部
  • 在Swing应用程序中,有一个菜单选项“内存设置…”。。。。当用户选择该选项时,解析用户的配置文件并填充一个设置对话框,以便用户可以更改任何合适的设置。当用户单击“应用”或“确定”时,根据用户选择的设置(在您的示例中为“
    -Xmx”
    ”),使用命令行选项覆盖用户配置文件,并显示一条消息,如重新启动应用程序以应用这些设置

捕获outofmemory expetion,启动swing用户对话框以设置内存限制,将此值传递给使用Runtime.exec()的线程,使用java-cp lib的jar vmoptions重新启动应用程序,该选项将启动一个新的jvm,并为用户指定内存大小。示例:


我们正在使用NSIS。此解决方案的问题是堆大小在安装时是固定的。当用户向计算机添加更多内存或必须处理比以前更大的文件时,应该能够在以后更改堆大小。如果用户需要更大的堆大小,只需要求用户重新运行安装程序并选择其他选项即可。如果您想让用户更方便,请尝试创建一个显示对话框窗口的小程序,让用户选择堆大小并以不同的进程启动主程序。有一个关于它的讨论,我喜欢在swing应用程序中有一个菜单的想法。当您设置内存配置时,我们可以重新加载用户定义的类加载器,在这里我们已经加载了应用程序。重新加载类加载器是不够的,我认为您需要退出并重新启动JVM,以使更改生效。 @echo off setlocal REM This reads the JVM command line options from a user configuration file for /f %x in (%HOMEDRIVE%%HOMEPATH%\myapp.config) do set JVM_OPTIONS=%x REM Important: call javaw and not java javaw -jar myApp.jar %JVM_OPTIONS% endlocal
 Runtime.getRuntime().exec("java -cp
 -Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar");