我在 JavaFX Scene Builder 中遇到了(似乎是)内存泄漏问题。我已经提交了错误报告,但与此同时,我的系统有时会变得难以忍受的缓慢,因为 Scene Builder 使用了 10+ GB。
作为临时解决方案,我想限制它可以使用的内存量。我尝试在 JVMOptions 下的 SceneBuilder.cfg 中设置以下内容:
-XX:InitialHeapSize=256m
-XX:MaxHeapSize=256m
-XX:MaxMetaspaceSize=256m
jps
确认参数已传递给流程:
3052 -Djava.library.path=/opt/SceneBuilder/app:/opt/SceneBuilder -Djava.launcher.path=/opt/SceneBuilder -Dapp.preferences.id=com/oracle/javafx/scenebuilder/app -XX:InitialHeapSize=256m -XX:MaxHeapSize=256m -XX:MaxMetaspaceSize=256m
然而,该过程的内存使用量仍然不断上升,远远超过 256MB,很快就超过 6GB 以上。
那么有没有办法真正限制 Java 进程使用的内存量?
编辑:我曾尝试使用ulimit
:
ulimit -d 1024000 -v 1024000 -m 1024000
但是当我尝试启动时出现错误:
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes
这表明 Java 确实忽略了 MetaspaceSize 参数。还有其他方法可以在 Java 8 中限制内存吗?
答案1
假设您使用基于 Unix 的操作系统。
您可以以不同的用户身份运行该程序并强制执行
/etc/security/limits.conf
此帐户中定义的限制。这也允许您为普通用户帐户保留更多资源。您可以尝试使用类似工具来控制该过程暂停。
但由于 ulimit 没有帮助,它可能最终导致进程崩溃(无法分配内存)或被系统终止。
另请退房https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process因为这是一个类似的问题。
编辑:至于忽略元空间限制。答案在这里https://stackoverflow.com/questions/31075761/java-8-reserves-minimum-1g-for-metaspace-despite-maxmetaspacesize