重新启动 JVM,使用更大的堆空间
我希望能够执行 .Jar 文件,如果堆空间设置得不够大,它应该启动一个具有相同 .Jar 文件的新 JVM,但设置更大的堆空间,然后关闭第一个JVM 和 .Jar。
我尝试过使用 ProcessBuilder,但无法让它工作。
它必须跨平台工作。
-ONi
I want to be able to execute the .Jar file, and if the heap space isn't set big enough, it should launch a new JVM with the same .Jar file, but set with a bigger heap space, and then close the first JVM and .Jar.
I've tried using the ProcessBuilder, but I can't get it to work.
It has to work cross platform.
-ONi
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我已经找到了解决方案,并且它可以跨平台工作。要从代码重新启动 JVM,请使用以下命令。这个答案取自我在此处搜索数小时后发现的另一个问题。如果需要,您可以在调用此方法后跟随 System.exit(0),以终止启动新进程的 JVM。
I have found the solution, and it works cross platform. To restart the JVM from code, use the following. This answer is taken from another question I found after hours of search in here. If you want, you can follow it with an System.exit(0), to terminate the JVM that started the new process, after a call to this method.
您可以使用初始堆大小启动 java,还可以指定仅在需要时使用的最大堆大小。我不确定你想做什么,但它可能会模仿你想要的行为?
在此示例中,您从 256M 开始,如果应用程序需要更多内存,它将逐渐增加,直到 1G。
You can launch java with an initial heap size, and also specify a maximum heap size which will be only be used as required. I'm not sure what you're trying to do but it might emulate the behaviour you want?
In this example you start with 256M, if the app needs more memory it will take it, incrementally, up until 1G.
您可以尝试将这两个来源结合起来。
MemoryRecoveryTest.java
尝试从
OutOfMemoryError
中恢复。IWantToBeBig.java
确保以指定的内存大小启动
Process
。You might try combining these two sources.
MemoryRecoveryTest.java
Makes attempts to recover from an
OutOfMemoryError
.IWantToBeBig.java
Ensures a
Process
is started with a memory size specified.我会在外部脚本文件中执行此类工作 - 使用伪代码:
捕获 OOME 并使用自定义代码退出应该始终是可能的。这种方法有一个问题 - 如果 $heap 值超过目标系统可能的最大堆空间(例如:Win32 系统上的 ~1.4GByte),那么它将不会终止。
注意:这只是问题的答案 - 通常人们会分配大量内存和/或解决内存泄漏 - 但我不知道实际的要求/限制
I'd do this kind of work in an outer script file - in pseudo code:
Catch OOME and exiting with a custom code should always be possible. There's one problem with this approach - if the $heap value exceeds the maximum heap space that is possible for the target system (example: ~1.4GByte on Win32 systems) then it will not terminate.
Note: this is just an answer to the question - usually one would assign a high amount of memory and/or fight the memory leaks - but I don't know the actual requirments/restrictions