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

Улучшен код с использованием возвращаемого значения Set#add вместо сравнения размера списка и набора.

public static <T> boolean hasDuplicate(Iterable<T> all) {
    Set<T> set = new HashSet<T>();
    // Set#add returns false if the set does not change, which
    // indicates that a duplicate element has been added.
    for (T each: all) if (!set.add(each)) return true;
    return false;
}
23
задан Vivo 4 December 2012 в 00:15
поделиться

1 ответ

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

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

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

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

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

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

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

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

75
ответ дан Steve Kallestad 4 December 2012 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: