如何可靠地为Java分配更多内存?

3
对于一个特定的Java程序,我需要比标准内存更多的内存,但我不能使用命令行来获得更多内存,因为它使用了启动器。
我尝试在Java控制面板中的运行时参数中添加“-Xms1024m -Xmx1024m”,这个方法可以有一次性地解决问题,但下一次我再次启动程序时,内存恢复到了低默认值。如何可靠地获取此程序所需的更多内存?

也许您可以使用自定义参数创建一个快捷方式? - fmucar
就像我说的那样,我不能使用命令行来启动它,也不知道它用来启动 .jar 文件的参数。此外,启动器会更新程序,因此无法将其删除。 - Kelvin Bongers
5个回答

3
大多数启动器(至少我看到的那些)都提供了应用jvm参数的选项。这就是您可以添加-Xms1024m -Xmx1024m的地方。例如,在Launch4J中,您可以像这样设置:

Launch4J JRE settings

您可以在底部看到,您还可以输入自己的参数,尽管内存部分已作为单独的选项给出。我敢打赌您的启动器应用程序也可以做到这一点。


这个启动器似乎并不会有所作为,它只提供了一个选择内存使用量的选项,但似乎并没有什么区别。 - Kelvin Bongers
@KelvinBongers 你在使用哪个启动器?你是如何使用它的?因为如果有配置选项可供设置,但仍无法解决问题,那么要么这是启动器的错误,要么你没有正确地使用它。 - brimborium

1
为什么不编写一个简单的Java进程,只需引导您的主进程?
因此,启动器启动进程A,进程A再使用您需要的参数启动进程B?

1

这个.exe启动器似乎又更新并启动了一个.jar启动器。 我通过在命令行中添加内存参数来启动.jar启动器,解决了这个问题。虽然这种方式不会自动更新启动器,但已经足够好了。


0

在你的启动器中,有一个类似于这样的函数调用...

 JNIEnv* create_vm(JavaVM ** jvm)
 {

JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
strcpy(options.optionString, CLASSPATH); //fix for options.optionString = CLASSPATH;
if (DEBUG) printf("optionString = %s\n", options.optionString); 
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;

int ret = JNI_CreateJavaVM(jvm, (void**) &env, &vm_args);
if (ret < 0) printf("\n<<<<< Unable to Launch JVM >>>>>\n");
return env;
}

是吧?如果是这样,只需要将这些选项添加到optionsString中即可。

听起来你要么硬编码它,要么提供一个.config文件给启动器设置这些属性。但是改变肯定会影响启动器。


我没有制作这个程序,也没有源代码访问权限。 - Kelvin Bongers
你不能使用命令行,也不能创建快捷方式,更不能修改代码,唯一有效的方法是在Java控制面板中手动操作。...我不想无礼,但听起来你已经有了一个可行的解决方案,是吗? - Shark
它曾经工作过,但由于某些原因停止了工作,我不知道为什么。我希望不要听起来那么模糊,但这就是发生的事情。 - Kelvin Bongers

0

如果您无法控制启动器,则必须创建自己的Java启动器。

您当前的启动器可以启动JAR文件,并且可以使用正确的JVM参数再次启动JAR文件。即,一个JAR文件可以使用Runtime.exec()运行自身(相同的主函数或不同的主函数),并带有您需要运行程序的参数。

据我所知,您无法使用控制面板来控制通过命令行运行的Java程序。如果现在无法正常工作,我怀疑它从未真正工作过,也许它不起作用并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接