如何在程序中编程增加Java堆大小

12

我有一个用于搜索文件的Java桌面应用程序,通常很快就达到了默认堆限制。由于我无法访问将安装该应用程序的所有系统,因此我想在应用程序本身中增加JVM堆大小。有人可以帮助我如何通过编程方式实现吗?


2
为什么不选择添加一些启动脚本(bat或sh),并定义jvm的启动参数(如Xmx),然后将其与应用程序一起部署呢? - Mirek Pluta
3
如果任何应用都可以随意提高限制,设定限制的目的将会是什么? - Mirko N.
你无法在运行中的应用程序中以编程方式更改内存限制。 - user177800
参考以下热点问题的RFE链接:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373 - Luke Quinane
可能是Can the JVM max heap size be dynamic?的重复问题。 - Raedwald
尽管这比https://dev59.com/C3A75IYBdhLWcg3wGlEa早,但是那个问题有更好的答案。 - Raedwald
5个回答

7

将-Xmx设置为1GB并不意味着JVM在启动时会分配那么多内存。JVM只会分配-Xms(加上开销)直到需要更多的堆空间为止。您是否需要保护用户免受虚拟内存抖动或操作系统内存分配失败?如果不需要,只需将Xmx设置为较大的值即可。请注意,Windows 32位的JVM通常会忽略大于1.2Gig的Xmx设置,因此最好不要请求超过1GB左右以确保安全。


1
32位JVM不会忽略大的最大堆大小,相反它们将无法启动。只需设置-mx1200m或类似选项。(-mx与-Xmx同样有效) - Peter Lawrey

5

目前没有标准的API可以这样做。

我建议您使用Java Web Start来调用应用程序(在最新的Sun Java 6中可用于本地应用程序),因为它允许您指定这个值。

然后,您可以有三个或四个链接,每个链接都指向完全相同的文件,但具有“Tiny”,“Medium”,“Large”和“Gigantic”堆大小。


2

2
看看类似于launch4j这样的东西,并考虑部署可执行文件,以便您可以控制某人开始运行应用程序时的限制。
您无法通过编程方式实现此操作。

2
针对桌面应用程序,我建议提供一个启动器,它可以指定所需的内存大小。除了配置JVM之外,您还可以提供图标、文件关联等功能。
请参考此SO问题以获取部署方案。

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