Java 创造;无法为对象堆保留足够的空间;错误

Java 创造;无法为对象堆保留足够的空间;错误,java,jvm,memory-management,Java,Jvm,Memory Management,是否有一个实用程序(用于Windows)会耗尽内存,以便我可以创建JVM“无法为对象堆保留足够的空间”错误 我想在JVM之外的进程中使用此内存。我想您可以尝试使用此内存: String s = "b"; for (int i = 0; i < 1000 000; i++) { s+="b"; } String s=“b”; 对于(int i=0;i

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


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

我想您可以尝试使用此内存:

String s = "b";
for (int i = 0; i < 1000 000; i++) {
  s+="b";
}
String s=“b”;
对于(int i=0;i<1000 000;i++){
s+=“b”;
}
因为每次运行行s+=“b”时都会分配新字符串,所以它应该在java堆中运行

只需使用-Xms标志

java -Xms3g org.foo.Main
上面将尝试创建3 GB的初始堆大小,只需调整该数字,使其大于系统的总内存(物理和虚拟)

List leak=new ArrayList();
while(true){
添加(新对象());
}

您可以通过运行大量如下所示的脚本来使用任意数量的内存:

public static void main(String[] args)
{
    List<String> l = new ArrayList<String>();
    for (long i = 0 ; i < 100000000l ; i++)
    {
        l.add(new String("AAAAAAA"));
    }
}
publicstaticvoidmain(字符串[]args)
{
列表l=新的ArrayList();
对于(长i=0;i<100000000升;i++)
{
l、 添加(新字符串(“AAAAA”);
}
}

具有足够大的堆空间(例如-Xmx1024M)。问题是,任何现代操作系统都会试图使用虚拟内存来允许应用程序仍能正常运行,这将导致硬盘驱动器抖动,而不是耗尽JVM的内存。您可能需要将操作系统总交换空间设置为某个固定值,才能实际遇到这种情况。

下面是一个小型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;
  }
}
#包括
int main(int argc,char*argv[]){
int bytes=atoi(argv[1]);
char*buf=malloc(字节);
而(1){
int i;
对于(i=0;i
旧字符串每次用完堆时都会被垃圾收集,因此智能实现可能永远不会对此给出异常。它们仍然必须存储生成的字符串。因此,对一个给定的字符串进行无限递增可能是值得的。这实际上不会像您在32位Windows框上解释的那样起作用,或者至少在我认为您的意思上是这样。JVM需要一个连续的堆地址范围,而Windows有一个2gb的漏洞。是的,它失败了,但不一定是因为盒子内存不足,而是因为它不能放在一个地址空间中。这里的真正目的是什么?使JVM由于内存耗尽而无法启动?或者你只是在寻找一些技巧来把信息打印出来?
#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;
  }
}