jvm Java堆空间错误-如何增加可以保留的最大数量?[不能超过1505 M]

rqdpfwrv  于 2022-11-07  发布在  Java
关注(0)|答案(3)|浏览(181)

我运行的是64位的Windows7,内存为4GB。我有32位的Java,我试图在Eclipse中运行一个图形搜索算法。我注解了所有的内容,除了一个简单的println(“Hello World”)
经过大量的修改之后,我发现我不能保留超过1505 M-1507 M(它在这之间变化--我不知道为什么)。

-Xms1505M

我在网上读到我应该能够保留最大2G的空间。一个快速的ctrl-alt-del检查显示我有2400 M可用空间和1200个缓存。
这里的事情变得奇怪:作为一个愚蠢的实验,我在谷歌浏览器上打开了50个标签,这样我就有400个可用内存,450个缓存。我用上面的标志运行我的eclipse程序,**它仍然运行。**我保留了1500 M的不存在的RAM。
谁来帮帮忙!这个程序是一个等级的,我已经被困在这个上面几个小时了。

bvjxkvbb

bvjxkvbb1#

带有虚拟内存的操作系统可能会执行一些奇怪的操作,内存使用统计数据可能并不总是告诉你你所认为的情况。一些内存可能会被换到磁盘上,这听起来像你在这里描述的那样,但每个程序列出的一些内存实际上是共享的(例如,由每个程序使用的系统库的副本,但是只有一个副本被加载到存储器中)。
更基本的问题是为什么您的图算法占用了如此大量的内存;除非您尝试使用全局Internet路由表,否则您可能没有正确地实现算法。

cngwdvgl

cngwdvgl2#

-Xms用于设置最小堆,在您的情况下,您需要使用-Xmx更改最大堆
在SO中还有其他帖子讨论-Xms-Xmx,这里是one of them

avwztpqn

avwztpqn3#

32位Windows程序在模拟的32位环境中运行,该环境设计为与Windows XP兼容。这意味着它也有与32位Windows相同的限制,并且根据您以前运行的程序,堆大小不能超过1.2 - 1.4 GB。
最简单的解决方法是:不要使用32位的Java。64位的Java会运行得更好/更快,除非你被迫使用32位的DLL。在这种情况下,我建议你有一个运行在32位的JVM,你从一个64位的程序中与它通信(RMI/消息传递/共享内存),这个程序完成所有的真实的工作。
我在网上看到我应该可以预订最多2G。
这在Java中的Windows 32位是不可能的。问题是堆必须是连续的,并且使用加载所有共享库后剩下的内存。
一个快速的ctrl-alt-del检查显示我有2400 M可用和1200缓存。
我想是时候多买一些内存了。如果你想认真使用内存的话,我不会买一台低于8 GB的笔记本电脑,我也不会买一台低于32 GB的PC。
这里的事情变得奇怪:作为一个愚蠢的实验,我在google chrome上打开了50个标签,这样我就有400个可用内存,450个缓存。我用上面的标志运行我的eclipse程序,它仍然运行。我保留了1500 M的不存在的内存。
操作系统可以访问更多的内存,只是不允许你在32位仿真中使用它。你可以有32 GB的主内存,但32位JVM仍然不能分配更多的内存。

相关问题