2015-01-29 4 views
2

следущие коды, которые проверяют использование памяти программы Java:Использование памяти не меняется в моей программе

List<Person> list = new ArrayList<Person>(); 
for (int i = 0; i <= 10000000; i++) { 
    list.add(new Person("Jim", "Knopf")); 
} 
// Get the Java runtime 
Runtime runtime = Runtime.getRuntime(); 
// Run the garbage collector 
runtime.gc(); 
// Calculate the used memory 
long memory = runtime.totalMemory() - runtime.freeMemory(); 
System.out.println("Used memory is bytes: " + memory); 

Выходной сигнал не всегда 286046, независимо от того, как изменить значение i. Но большой i означает использование большой памяти, не так ли? Любое объяснение?

ответ

3

Выхода всегда 286046, независимо от того, как я изменяю значение i. Но большой i означает использование большой памяти, не так ли? Любое объяснение?

Когда вы gc() на list это выпал из сферы (т.е. он снова не используется) и не сохраняется. Попробуйте поместить его в static, поскольку это нельзя отбросить.

Примечание: вы получите более точный учет памяти, если используете -XX:-UseTLAB, поскольку это отключает параллельное распределение памяти, что упрощает учет.

1

От Javadoc

Возвращает количество свободной памяти в виртуальной машине Java. Вызов Метод gc может привести к увеличению значения, возвращаемого freeMemory.

Мое предположение заключается в том, что, поскольку память выделяется с использованием большого chunck, она всегда возвращает то же самое, потому что вы остаетесь на низком уровне использования памяти. Попробуйте выполнить более высокий тест и не забудьте вызвать сборщик мусора System.gc();, чтобы сделать ваш тест более незабываемым.

Проверить это http://www.tutorialspoint.com/java/lang/runtime_freememory.htm

Я хотел бы также попробовать установить минимальную память -Xms очень низко, так что вы имеете больше шансов переполнения минимума и заставить JVM выделить больше и уменьшить freememory

Смежные вопросы