Цей зразок Вільяма Бренделя може бути корисним.
EDIT: Я спочатку надав цей зразок (посилаючись на відповідь Вільяма Бренделя на іншу тему). Творець цієї теми (Стів М) хотів створити мультиплатформену програму Java. Зокрема, користувач намагався знайти засіб, за допомогою якого можна було б оцінити ресурси запущеної машини (дисковий простір, використання центрального процесора та пам'яті).
Це вбудована розшифровка відповіді, даної в цій темі. Однак із цієї теми було зазначено, що це не ідеальне рішення, незважаючи на те, що моя відповідь позначена як прийнята.
public class Main {
public static void main(String[] args) {
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
System.out.println("Free memory (bytes): " +
Runtime.getRuntime().freeMemory());
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("Maximum memory (bytes): " +
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
System.out.println("Total memory (bytes): " +
Runtime.getRuntime().totalMemory());
File[] roots = File.listRoots();
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
Користувач Крістіан Фріс зазначає, що помилково вважати, що це Runtime.getRuntime().freeMemory()
дає вам обсяг пам'яті, який може бути виділений доти, доки не станеться помилка, коли немає пам'яті.
З документації повернення підпису Runtime.getRuntime().freeMemory()
як таке:
Повертає: наближення до загального обсягу пам'яті, доступного на даний момент для майбутніх виділених об'єктів, вимірюється в байтах.
Однак користувач Крістіан Фріс стверджує, що ця функція може бути сприйнята неправильно. Він стверджує, що приблизний обсяг пам'яті, який може бути виділений до виникнення помилки поза пам'яттю (вільна пам'ять), швидше за все, буде наданий:
long presumableFreeMemory = Runtime.getRuntime().maxMemory() - allocatedMemory;
З allocatedMemory
отриманням:
long allocatedMemory =
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory());
Ключовим тут є розбіжність між поняттям вільної пам’яті. Одна річ - це пам’ять, яку операційна система забезпечує віртуальною машиною Java. Інший - загальна кількість байтів, що включає фрагменти блоків пам'яті, які фактично використовуються самою віртуальною машиною Java.
Враховуючи, що пам’ять, що надається програмам Java, управляється блоками за допомогою віртуальної машини Java, кількість вільної пам’яті, доступної віртуальній машині Java, може не зовсім відповідати пам’яті, доступній для програми Java.
Зокрема, Christian Fries позначає використання -mx
або -Xmx
прапорів для встановлення максимального обсягу пам'яті, доступної для віртуальної машини Java. Він зазначає такі відмінності функцій:
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
Крістіан завершує свою відповідь тим, що Runtime.getRuntime().freeMemory()
насправді повертає те, що можна назвати імовірною вільною пам’яттю; навіть якщо майбутнє виділення пам'яті не перевищує значення, яке повертається цією функцією, якщо віртуальна машина Java ще не отримала фактичний шматок пам'яті, призначений основною системою, java.lang.OutOfMemoryError
все одно може бути створено.
Зрештою, правильний метод, який буде використовуватися, буде мати різну ступінь залежності від особливостей вашої програми.
Я надаю ще одне посилання, яке може бути корисним. Це питання, задане користувачем Річардом Дормандом на яке відповів stones333, щодо визначення розміру купи Java за замовчуванням.