0

我正在运行具有 4GB RAM 的 64 位 Windows 7。我有 32 位 java 我正在尝试在 eclipse 中运行图形搜索算法。除了一个简单的 println("Hello World") 之外,我绝对将所有内容都注释掉了。
经过大量修改后,我发现我不能保留超过 1505M-1507M(它在这之间有所不同——我不知道为什么)。也就是说,我将以下内容设置为我的 JVM 参数:

-Xms1505M

我在网上看到我应该最多可以预留2G。一个快速的 ctrl-alt-del 检查显示我有 2400M 可用和 1200 缓存。
这就是事情变得奇怪的地方:作为一个愚蠢的实验,我在谷歌浏览器上打开了 50 个标签,这样我就有 400 个可用内存,450 个缓存。我用上面的标志运行了我的eclipse程序,它仍然运行。我保留了 1500M 的不存在的 RAM。
有人请帮忙!这个程序是针对一个年级的,我已经坚持了好几个小时。

4

3 回答 3

2

具有虚拟内存的操作系统可以执行奇怪的技巧,并且内存使用统计数据可能并不总是告诉您您认为它们是什么。一些内存可能会被换出到磁盘,这听起来就像您在此处描述的那样,但是为每个程序列出的一些内存实际上是共享的(例如,每个程序使用的系统库的副本,但仅一份副本加载到内存中)。

更根本的问题是为什么你的图形算法占用了如此多的内存;除非您尝试在全球 Internet 路由表上工作,否则您可能错误地实现了该算法。

于 2013-08-02T00:14:42.613 回答
0

-Xms是设置最小堆,在您的情况下,您需要使用更改最大堆-Xmx

SO中还有其他帖子讨论-Xmsvs -Xmx,这是其中之一

于 2013-08-02T00:15:05.593 回答
0

32 位 Windows 程序在模拟的 32 位环境中运行,该环境旨在像 Windows XP 一样工作以实现兼容性。这意味着它也具有与 32 位窗口相同的限制,并且您不能拥有大于 1.2 - 1.4 GB 的堆,具体取决于您之前运行的内容。

最简单的解决方案是;不要使用 32 位 Java。除非您被迫使用 32 位 DLL,否则 64 位 Java 将运行得更好/更快。在这种情况下,我建议您有一个 32 位运行的 JVM,并通过一个 64 位程序与它通信(RMI/消息/共享内存),该程序完成所有实际工作。

我在网上看到我应该最多可以预留2G。

这在 Java 中的 32 位 Windows 中是不可能的。问题是堆必须是连续的,并且在加载所有共享库后使用剩余的内存。

一个快速的 ctrl-alt-del 检查显示我有 2400M 可用和 1200 缓存。

我想是时候获得更多的记忆了。如果您想认真使用内存,我不会购买小于 8 GB 的笔记本电脑,也不会购买小于 32 GB 的 PC。

这就是事情变得奇怪的地方:作为一个愚蠢的实验,我在谷歌浏览器上打开了 50 个标签,这样我就有 400 个可用内存,450 个缓存。我用上面的标志运行了我的eclipse程序,它仍然运行。我保留了 1500M 的不存在的 RAM。

操作系统可以访问更多内存,只是不允许您在 32 位仿真中使用它。您可以拥有 32 GB 的主内存,但 32 位 JVM 仍然无法分配更多内存。

于 2013-08-02T05:18:08.330 回答