Подтвердить что ты не робот

Высокое использование памяти Java даже для небольших программ

У меня есть несколько простых приложений, написанных в java, один из которых написан для работы в качестве виджета. Что меня удивило, сколько памяти используют даже небольшие приложения.

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

public class ram {
    public static void main(String[] args){
    while(true)System.out.print("Hello World");//while loop to give me time to check RAM usage
    }
}

Затем скомпилирован и запущен с java ram, и он дал мне следующее использование ОЗУ:

The process java (with pid 4489) is using approximately 43.3 MB of memory.
34460 KB    [heap]
7088 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/server/libjvm.so
1712 KB /usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar
136 KB  [stack:4495]
120 KB  /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/libjava.so

Разве это не слишком высоко? Особенно куча 34 МБ. Моя система - ArchLinux x86_64 и openjdk-7.

Есть ли способ минимизировать объем оперативной памяти, используемой JVM?

Изменить. Я попытался использовать флаг -Xmx, и это то, что я получил (1281k было самым маленьким, с которого я мог начать):

java -Xmx1281k ram
The process java (with pid 4987) is using approximately 27.6 MB of memory.
18388 KB    [heap]

Для сравнения, Python2 использует 4.4MB, Mono использует 4.3MB.

4b9b3361

Ответ 1

Я вижу, что подобные вопросы часто задают, и я еще не нашел удовлетворительного ответа.

Ответы, которые я вижу чаще всего, зол: "Почему вас это волнует?" ответы. Некоторые люди много думают и прикладывают усилия к тому, чтобы задать вопрос, и тот, кто спрашивает, кажется глупым.

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

Дело в том, что для небольших утилит Java - это память в большинстве операционных систем. Чем меньше полезность, тем она более очевидна. Разработчики Java уже давно были обусловлены тем, чтобы иметь дело с этим фактом или игнорировать его.

Причины для кажущегося аномального использования памяти многочисленны. Каждый поток получает определенный объем памяти для стека. Существует несколько потоков, которые будут начаты независимо от того, насколько проста программа для таких вещей, как очистка мусора, RMI и т.д. В Windows/64-бит, что 1 МБ на поток. Куча классов загружается по умолчанию и все ваши классы. Я уверен, что за кулисами происходит много других вещей.

Java сделала выбор компромисса, который нет на других языках. Время загрузки меньше, чем у большинства других языков. Первоначальная потребность в памяти выше. Строки, поскольку они наиболее часто используются, потребляют намного больше памяти, чем большинство людей понимают. Бесчисленное множество других. Выгода для многих ситуаций действительно окупается. Что-то вроде Hello World демонстрирует стоимость этих выборов больше, чем что-либо еще. Преимущества, такие как легкая многопоточная и почти-родная производительность, действительно не помогают вам с Hello World.

К сожалению, не так много, что вы можете сделать, чтобы действительно минимизировать память, используемую простым приложением. Существуют вышеупомянутые переключатели командной строки, и пробная версия и ошибка могут свести ваше заявленное использование до уровня 10-15 мб. Я уверен, но эти варианты и время, потраченные на их определение, не будут применяться к широкому кругу вопросов будущих приложений. Вам нужно будет пройти один и тот же процесс для следующего приложения. Бросьте в GUI-интерфейс и некоторые протоколирования и еще одну общую библиотеку или две, и ваш базовый номер будет быстро стрелять до 60mb.

Ты не делаешь ничего плохого. Это то, как все работает на Java. Вы привыкнете к этому. Из-за этого вы выберете другой язык, и это тоже ОК.

Ответ 2

Для этого есть несколько причин:

  • Время выполнения java - довольно сложная программа сама по себе. Он должен взять байтовый код вашей Java-программы (выход из javac), перевести его в машинный код для системы, на которой он запущен, есть оптимизатор для этого, есть интерфейсы для отладки и т.д.
  • Хотя ваша программа довольно мала, Java по-прежнему загружает многие классы из своей стандартной библиотеки. Вы можете наблюдать это, запустив его, используя "java -verbose: class ram"
  • Java выделяет большое количество памяти для вашей программы заранее - она ​​не может знать, сколько памяти она действительно понадобится. Это, в частности, управляется опцией -Xmx. Существует несколько типов такой памяти. Чтобы узнать больше о них, вы можете использовать инструмент JConsole, который включен в папку JDK bin. Подробнее об этом можно узнать на java.sun.com. Сводка областей памяти, используемых Java, также предоставляется в в этом вопросе о стеке