динамически увеличивающееся пространство кучи Java - PullRequest
9 голосов
/ 04 августа 2010

Я написал Java-программу, которая тестирует скорость нескольких многопоточных алгоритмов на разных машинах с различным числом процессоров.

На некоторых машинах сортировка слиянием * завершается неудачно, поскольку для работы с очень большими массивами требуется значительное пространство кучи.Я могу легко изменить пространство кучи Java перед запуском программы, но я чувствую, что более надежным и простым подходом было бы выполнить эту задачу из самой программы.

Есть ли способзапросить / получить больше пространства кучи от виртуальной машины во время выполнения Java-программы?

Примечание. Я понимаю, что могу выполнить программу с помощью скрипта типа "java"Программа -Xmx1g ";мое любопытство по этому вопросу отчасти академическое.

* Моя реализация НЕ сливается в строке.Требуется O (n) дополнительной памяти.

Ответы [ 3 ]

6 голосов
/ 04 августа 2010

Насколько я знаю, нет способа контролировать размер кучи во время выполнения.

Хотя в этом нет необходимости: вы можете указать минимальный и максимальный размер кучи с помощью ключей -Xms и -Xmx соответственно. (например, -Xms128m -Xmx512m) JVM будет управлять фактическим размером кучи в этих пределах.

2 голосов
/ 04 августа 2010

Максимальный размер - это не размер используемой памяти, а динамический в зависимости от использования.

Максимальный размер кучи должен быть точкой, в которой вы предпочли бы сбой программы, чем использовали больше памяти.Нет смысла менять это динамически, даже академически.

2 голосов
/ 04 августа 2010

Java не была предназначена для возможности динамического управления памятью, в данном случае «пространство кучи Java», напротив, оно было разработано для того, чтобы избавить программиста от необходимости беспокоиться об этом.

Короче говоря, я боюсь сказать, что в Java нет ничего похожего на "malloc()" или "setHeapSize(int byes)".

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

Для такого динамического распределения памяти вы должны попытаться использовать свой алгоритм, используя вместо этого язык, такой как C и / или C++.

...