Java 如何增加Eclipse上JUnit测试的VM内存大小?
我正在尝试运行一个简单的JUnit测试,其中包括以下代码: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(
@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
}
您的替代代码工作得很好。非常感谢。您的替代代码工作得很好。非常感谢。