有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确限制JVM的内存使用?

我为我的问题困扰了很长一段时间。为了给大家一个小背景,我用Java编写了一个机器人,并计划在Raspberry Pi 3模型a+24/7上运行它。令我惊讶的是,当我测试几乎完成的程序时,它的内存消耗一直在无限期地增长

很快我意识到,在过去的几个月里,我不得不限制在几个网站上查找的内存使用。不幸的是,其中大多数都过时了(2013年及更老的版本),只有极少数更新的版本没有涵盖必须发生的重要变化,因为我无法弄清楚我的问题仍然存在的原因

在这么长的一段时间里,我尝试了很多东西,我不确定我是否能总结出我迄今为止尝试过的所有东西,但如果我记得一些重要的细节,我会更新这篇文章

请查看我上一次考试的图片,设置如下:

java -Xmx4m -Xms4m -Xss64k -XX:MaxMetaspaceSize=8m -jar bot.jar

enter image description here

enter image description here

正如您所见,内存不受限制,并上升到进程不久后被终止的程度。在我之前的一些测试中,我使用了空while(true)循环,因为我认为我的程序中没有内存泄漏。奇怪的是,空循环也非常缓慢地增加了内存大小,但也没有随着时间的推移而减少

此时,我甚至不确定JVM是否能够拥有指定的内存限制。我的代码使用Robot类进行屏幕截图,并在嵌套的while循环中触发某些按钮,这也提醒垃圾收集器使用系统提示收集。gc()。我是否也必须为JVM使用以下参数

-XX:MaxDirectMemorySize

我也对Java上的所有变化感到困惑。我尝试了几种不同的JDK,因为我认为这可能会解决问题。最后一个测试是用JDK 14编译的,在Java 11上运行。我需要在操作系统上配置一些东西来限制内存消耗吗

也许你们也可以向我推荐一个剖析器,我可以用它来检查什么是分配内存的,以便通过参数找出需要限制的内容,但我肯定需要一些帮助,因为我以前从未使用过

我非常感谢大家对这个话题的帮助!如果您需要任何其他信息,请告诉我,我将在本周内尽力跟进


共 (0) 个答案