Получение памяти, доступной для JVM во время выполнения - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь отсортировать кучу данных так, чтобы размер ввода данных в программу мог быть больше, чем объем памяти, доступный для JVM, и обработка, которая требует внешней сортировки, которая намного медленнее, чем Quicksort.

Есть ли какой-нибудь способ получения памяти, доступной JVM во время выполнения, чтобы я мог использовать сортировку на месте настолько, насколько это возможно, и переключаться на Mergesort только тогда, когда ввод данных слишком велик?

Ответы [ 4 ]

8 голосов
/ 11 июня 2010

Проверьте эти методы в классе java.lang.Runtime:

freeMemory

totalMemory

maxMemory

* * Пример тысячи двадцать-одина * +1022 *

Runtime rt = Runtime.getRuntime();
System.err.println(String.format("Free: %d bytes, Total: %d bytes, Max: %d bytes",
  rt.freeMemory(), rt.totalMemory(), rt.maxMemory()));

Также обратите внимание, что если общий объем памяти исчерпан, вы всегда можете запустить JVM с большим объемом кучи, выделенной с помощью аргумента -Xmx JVM; например,

java -Xmx256M MyClass
1 голос
/ 11 июня 2010

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

1) freeMemory () - это нижняя граница фактической доступной памяти, поскольку памятьна который нет ссылок и он готов к GC, считается использованным.Запуск System.gc () перед вызовом может дать более точный результат.

2) totalMemory () может измениться - он указывает только текущий общий размер кучи, и куча может расширяться / уменьшаться JVM вовремя выполнения, в зависимости от его использования.Вы можете использовать maxMemory (), чтобы получить фактический максимум.

1 голос
/ 11 июня 2010

Теоретически да, используя Runtime.getRuntime().maxMemory().

На практике есть проблема, которую нужно решить:

  1. Вам необходимо выяснить, сколько объектов приложения поместится в заданное количество байтов памяти. AFAIK, нет простого / эффективного способа сделать это в работающем приложении.

  2. Вы не хотите пытаться использовать все доступное пространство кучи. Если вы увеличите процентное размещение в куче слишком высоко, вы рискуете сделать GC ужасно неэффективным.

  3. Метод maxMemory() говорит только о том, насколько велика куча виртуальной памяти. Физический размер также может быть фактором (особенно если физический размер << виртуальный размер), и нет никакого портативного способа выяснить это. </p>

Если бы я пытался реализовать это приложение, думаю, я бы просто сделал размер сортировки в памяти параметром конфигурации или параметром командной строки.

1 голос
/ 11 июня 2010

Вы можете использовать класс Runtime, чтобы получить объем доступной памяти.

Runtime r = Runtime.getRuntime();
System.out.println(r.totalMemory());

Существуют различные другие детали памяти, которые вы можете получить из объекта Runtime - см. Класс Runtime .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...