2010-05-04 24 views
2

是否有一个用于内存的实用程序(对于Windows),因此我可以创建一个JVM“无法为对象堆预留足够的空间”错误?创建“无法为对象堆预留足够的空间”错误

我想在JVM之外的进程中使用此内存。

+0

在什么平台上? – 2010-05-04 15:18:47

+0

这里真正的目标是什么?由于盒子内存耗尽使JVM无法启动?或者你只是在寻找任何技巧来打印信息? – 2010-05-04 23:00:30

回答

7

只需使用-Xms标志

java -Xms3g org.foo.Main 

以上将尝试创建3 GB的初始堆大小,只需调整数量,以便它比你的系统的总内存较大(物理&虚拟)

+0

这实际上不会像你在32位Windows机器上解释的那样工作,或者至少在我认为你的意思上是这样。 JVM需要堆的连续地址范围,而Windows有2GB的漏洞。所以是的,它失败了,但不一定是盒子内存不足,而是因为它不适合单个地址空间。 – 2010-05-04 22:59:36

-1

我想你可以用这一个尝试:

String s = "b"; 
for (int i = 0; i < 1000 000; i++) { 
    s+="b"; 
} 

因为新的字符串将每次S + =“b”的运行线路,它应该运行了Java堆分配。

+0

旧的字符串可以在每次堆耗尽时收集垃圾,因此智能实现可能永远不会因此发出异常。 – Arkku 2010-05-04 15:31:55

+0

他们仍然必须存储结果字符串。因此,它可能是无限递增给定的字符串。 – Puppy 2010-05-04 15:49:10

-1
List<Object> leak = new ArrayList<Object>(); 
while(true) { 
    leak.add(new Object()); 
} 
-1

您可以通过运行一些脚本使用了内存的任意量是这样的:

public static void main(String[] args) 
{ 
    List<String> l = new ArrayList<String>(); 
    for (long i = 0 ; i < 100000000l ; i++) 
    { 
     l.add(new String("AAAAAAA")); 
    } 
} 

具有足够大的堆空间(例如, -Xmx1024M)。问题在于,任何现代操作系统都会尝试使用虚拟内存来允许应用程序仍然运行,这将导致硬盘驱动器发生颠簸而不是JVM的内存不足。您可能需要将您的操作系统总交换空间设置为实际遇到此方案的某些内容。

-1

这是给你一个小C程序会消耗在命令行上指定的字节数:

#include <stdlib.h> 
int main(int argc, char *argv[]) { 
    int bytes = atoi(argv[1]); 
    char *buf = malloc(bytes); 
    while (1) { 
    int i; 
    for (i = 0; i < bytes; i++) buf[i] += 1; 
    } 
} 
相关问题