所以,我有一个 java jar 可以在我的树莓派上运行,它需要大量内存。我在外部 USB 闪存驱动器上设置了 2 GB 交换。但是当我用 -Xmx2048M 启动 jar 时,它说它无法为 2097152KB 对象堆保留足够的空间。我知道这是一个坏主意,但我还是想这样做。如何让 java 将交换识别为堆空间?
问问题
154 次
1 回答
2
Java 不知道交换空间。它只是要求操作系统提供“更多内存”,操作系统会根据仍然可用的内容说“是”或“否”。
在树莓派操作系统级别配置交换空间;有关详细信息,请参阅如何设置交换空间。
但是你尝试过正常的东西吗?
- 使用
-Xmx
JVM 命令行选项设置 Java 堆大小1。(详情请参阅man java
。) - 检查是否存在阻止 JVM 进程请求更多内存的每个进程的“ulimit”。(详情请参阅
man ulimit
。)
1 - 这不是“告诉它使用交换”。它告诉 Java 将最大堆大小设置为与默认最大堆大小不同的值。
更新- 我从评论中看到您知道 -Xmx 选项,并且可能正在使用它。所以这还剩下一件事。由于您在 32 位操作系统上使用 32 位 JVM,因此 JVM 的总内存使用量存在架构限制。限制将小于 4 GB ......全部完成。(据此,限制是 3.6 GB 左右,但我不相信这是准确的。)
如果你遇到这个限制,恐怕你无能为力。
你说:
即使我将 -Xmx 设置为 1900M 它也会失败
完整的错误/异常消息是什么?
我只需要更多的内存。
好吧,如果您确实需要更多 RAM,则需要购买具有更多 RAM 的 Raspberry Pi。(显然,在现有 Pi 上扩展 RAM 没有任何受支持的选项。)
增加 RAM 和增加可用虚拟内存不是一回事......
请注意,如果您将 JVM 堆的大小设置为大于可用 RAM,那么当 JVM 执行完整的垃圾回收时,您很可能会遇到抖动问题。
于 2020-11-18T07:43:35.740 回答