Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使Linux JVM 64位上发生OutOfMemoryError_Java - Fatal编程技术网

Java 如何使Linux JVM 64位上发生OutOfMemoryError

Java 如何使Linux JVM 64位上发生OutOfMemoryError,java,Java,在我的单元测试中,我故意尝试引发OutOfMemoryError异常。我使用如下简单语句: byte[] block = new byte[128 * 1024 * 1024 * 1024]; try { List<Object> tempList = new ArrayList<Object>(); while (true) { tempList.add(new byte[128 * 1024 * 102

在我的单元测试中,我故意尝试引发OutOfMemoryError异常。我使用如下简单语句:

byte[] block = new byte[128 * 1024 * 1024 * 1024];
    try {
        List<Object> tempList = new ArrayList<Object>();
        while (true) {
            tempList.add(new byte[128 * 1024 * 1024 * 1024]);
        }
    } catch (OutOfMemoryError OME) {
       // OK, Garbage Collector will have run now...
    }
该代码在Win7 64位和jdk6u21 64位上工作。但是,当我在Centos 5 64位jdk6u21上运行此程序时,不会抛出OutOfMemoryError,即使我将数组的大小增大了


有什么想法吗?

Linux并不总是立即为您分配所需的所有内存,因为许多实际应用程序所需的内存比它们所需的要多。这被称为过度限制(它也意味着有时它猜错了,以及可怕的打击)


对于您的单元测试,我只需手动抛出。

没有OutofMemoryError的原因是内存分配处于未提交状态,没有页面

如果在数组的每个4K中写入一个非零字节,则会导致分配内存

ulimit -v 102400 
ulimit -d 102400
unitTest.sh
上述情况应将单元测试限制为1M的虚拟内存和1M的数据段大小。当您达到这两个目标中的任何一个时,您的流程应该得到ENOMEM。注意,这些限制适用于您称之为出口的进程/外壳;您可能希望在子shell中运行它们


man 2 setrlimit
了解发动机罩下的工作原理<代码>帮助ulimit获取ulimit命令。

128*1024*1024*1024=0,因为int是32位的。Java不支持大于4Gb的阵列。

如果您只想消耗所有内存,请执行以下操作:

byte[] block = new byte[128 * 1024 * 1024 * 1024];
    try {
        List<Object> tempList = new ArrayList<Object>();
        while (true) {
            tempList.add(new byte[128 * 1024 * 1024 * 1024]);
        }
    } catch (OutOfMemoryError OME) {
       // OK, Garbage Collector will have run now...
    }
试试看{
List templast=new ArrayList();
while(true){
add(新字节[128*1024*1024*1024]);
}
}捕获(OutOfMemoryErrorOME){
//好的,垃圾收集器现在已经运行了。。。
}

您可以通过使用
-Xmx
标志故意将JVM的最大堆大小设置为一个较小的值

启动以下程序:


public final class Test {

  public static void main(final String[] args) {
    final byte[] block = new byte[Integer.MAX_VALUE];
  }

}
使用以下JVM参数:
-Xmx8m

这样就可以做到:


Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Test.main(Test.java:4)

较小的点,但分配新的长[Integer.MAX_VALUE]将占用8倍的内存。(每个约16 GB)

为什么阵列的每个4K?如果我在整个数组中填充一个字节值,如下面所示,它会是相同的吗?字节b=10;数组。填充(块,b);海报假定块大小为4k(这在afaik是合理的)。每4k一个字节比填充整个数组要快。我真的很想发布一个答案,只包含
抛出新的OutOfMemoryError()但是现在没有意义了+对不起,可能是我不清楚。我不想简单地扔掉记忆,而是想耗尽记忆直到干涸。这是因为我正在测试软内存引用谢谢!这很有效。我只是将新字节[128*1024*1024*1024]更改为新字节[Integer.MAX_VALUE]。