Попробуйте собрать мусор перед созданием тестового массива с помощью runtime.gc()
.
Если вы не создаете совершенно новую JVM каждый раз, вы можете получить бит, имея разные начальные состояния.
Шахта работает для значений> 1. 1,25, например.Затем я получаю исключение «пространства кучи».
Здесь, возможно, вы хотите вместо этого использовать maxMemory ().
public class Mem2 {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
runtime.gc();
long freeMemory = runtime.freeMemory();
// This is some arbitary factor that should work <= 1
double factor = 1.29;
int size = (int) (factor * freeMemory);
System.out.println(" freememory is " + freeMemory);
System.out.println(" size is " + size);
System.out.println("the total memory is " + runtime.totalMemory());
System.out.println(" the max memory is " + runtime.maxMemory());
byte[] testArray = new byte[size];
}
}
Вывод:
freememory is 84466864
size is 108962254
the total memory is 85000192
the max memory is 129957888
Process finished with exit code 0
Так что, похоже, около 20M я не могу учесть.
Я думаю, что totalMemory () - это объем памяти, выделенный в данный момент JVM, freeMemory () - это то, сколько из этого было использовано, иmaxMemory () - это жесткое ограничение.
Вы можете увидеть взаимодействие между totalMemory()
и freememory()
с этим вариантом в вашем коде.
public class Mem3 {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
for (int i = 0; true; i++) {
runtime.gc();
int size = i * 10000000;
System.out.println(" i is " + i);
System.out.println(" size is " + size);
System.out.println("b freememory is " + runtime.freeMemory());
System.out.println("b the total memory is " + runtime.totalMemory());
System.out.println("b the max memory is " + runtime.maxMemory());
byte[] testArray = new byte[size];
System.out.println(" array " + testArray.length);
System.out.println("a freememory is " + runtime.freeMemory());
System.out.println("a the total memory is " + runtime.totalMemory());
System.out.println("a the max memory is " + runtime.maxMemory());
System.out.println(" ");
}
}
}
Если вы запустите этои посмотрите на значения до и после, вы можете увидеть, что происходит.Обратите внимание на то, что происходит между целыми числами 6 и 7:
i is 6
size is 60000000
b freememory is 84300496
b the total memory is 85000192
b the max memory is 129957888
array 60000000
a freememory is 24300472
a the total memory is 85000192
a the max memory is 129957888
i is 7
size is 70000000
b freememory is 84300496
b the total memory is 85000192
b the max memory is 129957888
array 70000000
a freememory is 59258168
a the total memory is 129957888
a the max memory is 129957888
Мы видим в 6, что после выделения 60 миллионов осталось около 24 миллионов.В 7, однако, мы превысили порог.Выделено больше памяти (обратите внимание на totalMemory), а freeMemory теперь чуть менее 60M.