让java明白swap存在,并鼓励他使用它[关闭]

Posted

技术标签:

【中文标题】让java明白swap存在,并鼓励他使用它[关闭]【英文标题】:Make java understand that swap exists, and encourage him to use it [closed] 【发布时间】:2021-03-01 10:57:38 【问题描述】:

所以,我有一个 java jar 可以在我的树莓派上运行,它需要大量内存。我在外部 USB 闪存驱动器上设置了 2 GB 交换。但是当我用 -Xmx2048M 启动 jar 时,它说它无法为 2097152KB 对象堆保留足够的空间。我知道这是一个坏主意,但我还是想这样做。如何让 java 将交换区识别为堆空间?

【问题讨论】:

这可能是您的树莓派的操作系统阻止了交换。因为在 SD 卡上交换大量数据只是愚蠢的。如果您真的想要交换,请将一个真正的 USB 硬盘连接到您的 PI 并在该磁盘上创建一个交换文件/分区。但是,如果您问我,请不要在 PI 上使用 java,至少不要使用那么大的 java 应用程序,哈哈。 @paladin 我的交换文件已经在 USB 闪存驱动器上,我只需要更多内存,我接受后果 Java 只是向操作系统请求堆内存,由操作系统来使用交换。这是 32 位 Java 吗? 2Gb 左右通常是 32 位 Java 可以使用的最大内存,需要 64 位才能使用更多。 @greg-449 即使我将 -Xmx 设置为 1900M 也会失败 只是为了确保;您使用的是 64 位操作系统吗? 【参考方案1】:

Java 不知道交换空间。它只是要求操作系统提供“更多内存”,操作系统会根据仍然可用的内容说“是”或“否”。

在树莓派操作系统级别配置交换空间;详情请见How to set up swap space。

但是你尝试过正常的东西吗?

使用-Xmx JVM 命令行选项设置Java 堆大小1。 (详情请参阅man java。) 检查是否存在阻止 JVM 进程请求更多内存的每个进程的“ulimit”。 (详情请参阅man ulimit。)

1 - 这不是“告诉它使用交换”。它告诉 Java 将最大堆大小设置为与默认最大堆大小不同的值。


更新 - 我从评论中看到您知道 -Xmx 选项,并且可能正在使用它。所以这还剩下一件事。由于您在 32 位操作系统上使用 32 位 JVM,因此 JVM 的总内存使用量存在 架构 限制。限制将小于 4 GB ......全部完成。 (根据this,限制是3.6 GB左右,虽然我不相信这是准确的。)

如果你遇到这个限制,恐怕你无能为力。

你说:

即使我将 -Xmx 设置为 1900M 也会失败

完整的错误/异常信息是什么?


我只是需要更多的内存。

好吧,如果您字面上需要更多 RAM,则需要购买具有更多 RAM 的 Raspberry Pi。 (显然,在现有 Pi 上扩展 RAM 没有任何受支持的选项。)

增加 RAM 和增加可用虚拟内存不是一回事...

请注意,如果您将 JVM 堆的大小设置为大于可用 RAM,那么当 JVM 执行完整的垃圾回收时,您很可能会遇到抖动问题。

【讨论】:

我已经正确设置了交换,我的问题是java没有看到它。 请验证您的交换是否按预期工作,覆盆子操作系统通常具有启用交换的“不同”设置,这实际上是禁用交换,即使配置了交换文件/分区。 是的,它按预期工作。我已经对 ram 进行了压力测试并使用了交换 “我已经正确设置了交换,我的问题是 java 看不到它。” - 你没有配置了它正确。如果你这样做了,那么 Java 看到它。抱歉,Java 没有办法配置交换空间。这不是它的关注点。这不是非特权应用程序甚至可以配置的东西。

以上是关于让java明白swap存在,并鼓励他使用它[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java类文件中main()方法的首选位置[关闭]

包含多个异常的自定义异常:鼓励还是不鼓励?

SWAP函数

C/C++ 有关swap的 用swap交换两个结构体的时候驶是如何交换的,

IRC Python Bot:最佳方式 [关闭]

比特币的微妙和魅力