Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 如何增加Eclipse上JUnit测试的VM内存大小?_Java_Eclipse - Fatal编程技术网

Java 如何增加Eclipse上JUnit测试的VM内存大小?

Java 如何增加Eclipse上JUnit测试的VM内存大小?,java,eclipse,Java,Eclipse,我正在尝试运行一个简单的JUnit测试,其中包括以下代码: @Test public void testVeryLongString() { String s = "0123456789"; String repeated = new String(new char[214748364]).replace("\0", s); assertEquals(2147483640, repeated .length(

我正在尝试运行一个简单的JUnit测试,其中包括以下代码:

    @Test
    public void testVeryLongString() {
            String s = "0123456789";
            String repeated = new String(new char[214748364]).replace("\0", s);
            assertEquals(2147483640, repeated .length());
   }
@Test
public void testVeryLongString() {
    String s = "0123456789";
    char[] chars = new char[214_748_364 * s.length()]; // Java 9+: 107_374_182
    for (int i = 0; i < chars.length; i += s.length()) {
        for (int j = 0; j < s.length(); j++) {
            chars[i+j] = s.charAt(j);
        }
    }
    String repeated = new String(chars);
    assertEquals(2_147_483_640, repeated.length()); // Java 9+: 1_073_741_820
}
当请求的数组大小超过VM限制时,它在上述行上失败

我尝试在64GB Windows工作站上将此测试的运行配置增加到-Xmx18292m,但我仍然发现可怕的请求数组大小超过了VM限制

我错过了什么

有没有办法让测试继续进行而不会在此VM限制上失败?

请求的数组大小超过VM限制意味着试图分配大于Integer.MAX_值的数组。由于用于String.replace的Java 9字符串和StringBuilder。。。在内部使用一个字节数组,其大小是字符串长度的两倍,而不是相同长度的字符数组

使用Java8和足够的内存,比-Xmx18292m多得多,因为执行字符串需要额外的数组。。。为了避免OutOfMemoryError,它应该可以工作

为了获得更好的性能和更少的内存需求,请使用以下代码:

    @Test
    public void testVeryLongString() {
            String s = "0123456789";
            String repeated = new String(new char[214748364]).replace("\0", s);
            assertEquals(2147483640, repeated .length());
   }
@Test
public void testVeryLongString() {
    String s = "0123456789";
    char[] chars = new char[214_748_364 * s.length()]; // Java 9+: 107_374_182
    for (int i = 0; i < chars.length; i += s.length()) {
        for (int j = 0; j < s.length(); j++) {
            chars[i+j] = s.charAt(j);
        }
    }
    String repeated = new String(chars);
    assertEquals(2_147_483_640, repeated.length()); // Java 9+: 1_073_741_820
}
请求的数组大小超过VM限制意味着试图分配大于Integer.MAX_值的数组。由于用于String.replace的Java 9字符串和StringBuilder。。。在内部使用一个字节数组,其大小是字符串长度的两倍,而不是相同长度的字符数组

使用Java8和足够的内存,比-Xmx18292m多得多,因为执行字符串需要额外的数组。。。为了避免OutOfMemoryError,它应该可以工作

为了获得更好的性能和更少的内存需求,请使用以下代码:

    @Test
    public void testVeryLongString() {
            String s = "0123456789";
            String repeated = new String(new char[214748364]).replace("\0", s);
            assertEquals(2147483640, repeated .length());
   }
@Test
public void testVeryLongString() {
    String s = "0123456789";
    char[] chars = new char[214_748_364 * s.length()]; // Java 9+: 107_374_182
    for (int i = 0; i < chars.length; i += s.length()) {
        for (int j = 0; j < s.length(); j++) {
            chars[i+j] = s.charAt(j);
        }
    }
    String repeated = new String(chars);
    assertEquals(2_147_483_640, repeated.length()); // Java 9+: 1_073_741_820
}

您的替代代码工作得很好。非常感谢。您的替代代码工作得很好。非常感谢。