Это нормально для Java-программы, чтобы работать на 60M или 90M? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть программа прокси-сервера, которая прослушивает сокет и создает пул потоков для обработки соединений, которые при необходимости создают новые потоки для обработки любых дополнительных издержек. Когда я запускаю программу на java 1.5, ее объем памяти составляет 90M, а если я использую java 1.6 jvm, она занимает 60M, это кажется большим для простой программы прокси-сервера, это нормально?

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

Приведенные выше статистические данные относятся к тому моменту, когда я начинаю с начального размера пула потоков меньше 10. Я увеличиваю первоначальный размер пула потоков до 50, его объем памяти на jvm 1.5 составляет около 120M.

Как я могу уменьшить использование памяти?

Ответы [ 4 ]

3 голосов
/ 08 декабря 2011

Это кажется правильным для небольшого процесса Java - помните, что Java не является идеальным выбором, если вы ищете очень маленький объем памяти.

Вы должны помнить, что JVM - это стек.основанный на машине, где каждый поток получает свой собственный стек.

Размер стека различается в зависимости от того, какой тип JVM вы используете - (я полагаю, поскольку я потерял страницу на oracle.com, в которой подробноэти значения) 32-разрядная JVM запускает каждый поток со стеком 320 КБ, а 64-разрядная JVM назначает 1 МБ на поток - это объясняет, почему большой пул потоков увеличивает размер памяти.

Помимо стека, JVM такжевыделяет пространство памяти для кучи - пространство стека обычно не выделяется из кучи, поэтому все это монтируется.

Если вы превышаете ограничения памяти, вы можете попытаться ограничить использование с помощью командыЛиния переключается при запуске приложения Java.

java -Xmx100m -Xss128k <followed by your other usual params>
  • -Xmx используется для ограничения максимального размера кучи (например, -Xmx100m будет ограничивать кучу до 100 МБ.
  • -Xss используется для ограничения размера стека, назначенного для каждого потока (например,-Xmx128k будет ограничивать каждый стек до 128 КБ).

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

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

Как уже упоминал Инго, я бы сказал,Рекомендуется использовать профилировщик для своего приложения, чтобы увидеть, где выделяется память - во многих популярных IDE либо встроен профилировщик, либо они доступны в виде плагинов.

1 голос
/ 08 декабря 2011

Звучит вполне нормально. Если объем памяти важен, стоит попробовать разные JVM, так как они могут быть более эффективными или раздутыми. Вы можете попробовать уменьшить размер стека потока и размеры выделения TLAB, чтобы уменьшить накладные расходы на поток.

1 голос
/ 08 декабря 2011

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

1 голос
/ 08 декабря 2011

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

Вы можете, например, взглянуть на jvisualvm.Вы можете наблюдать за распределением памяти в режиме реального времени или делать снимок и анализировать потребление памяти для каждого класса в отдельности.

...