2012-06-12 5 views
1

В настоящее время у меня есть четыре различных java-приложения, которые запускаются баночками, запущенными .bat-файлами, размещенными в папке с открытием в главном меню Windows XP Embedded. Я также запускаю Firefox. Теперь либо Firefox, либо одно из приложений Java просто выключается. Угадай, что у меня закончилась память (Win XP Embedded с 512 МБ ОЗУ).Использование памяти JVM, одна JVM с потоками или четыре JVM для каждого из моих четырех приложений?

Четыре Java приложения являются,

  • HMI бэкенд (встроенный с Спарк "микро" Framework)
  • Регистратор приложение, которое записывает данные из PLC в базу данных H2. Это с помощью Timer/Timertask
  • Сервер базы данных h2
  • Планировщик для выполнения периодических заданий. Это с помощью кварца.

Итак, каждое из этих Java-приложений запускается в их собственной JVM (насколько мне известно). Первый вопрос: могу ли я уменьшить использование памяти этих четырех приложений, запустив их в одной JVM вместо четырех. Если да, то это потоки, которые я должен использовать для запуска каждого из этих приложений?

Кроме того, что является первой основной задачей, которую я должен сделать, чтобы уменьшить объем памяти, являющийся совершенно новым для «реального» Java-программирования, как и я. H2, повторно использовать объекты и что еще? Jconsole и этот материал Xmx?

Удовлетворительно наивно, но я действительно думал, что эй, GC позаботится обо мне "все". Думаю нет? =)

Редактировать: Бэкэнд HMI использует веб-сервер Jetty. Кроме того, весь код является либо Open Source, либо построен мной.

Редакция 2: Веб-каркас: http://www.sparkjava.com/. Я обслуживаю статические носители через фреймворк, а не через Jetty (jetty-webapp-7.3). Возможно, это поможет улучшить использование памяти? Другими компонентами веб-приложения HMI являются механизм шаблонов freemarker, gson, servlet-api-3, slf4j и log4j.

Возможно, попытка запуска регистратора и планировщика в потоках при запуске webapp может быть возможна. Затем нужно запустить только две JVM. Один для webapp и один для сервера базы данных.

Я использую Java 7 и 32-битную систему. Это, надеюсь, будет для использования в производстве (или у меня проблемы).

+3

У меня такое чувство, что все рабочие места плотно интегрированы, поэтому вы должны попытаться запустить их с одним основным. Это уменьшит потребность в памяти и потребности процессора. – tom

+0

@tom - Я не знаком с некоторыми из упомянутых компонентов, но мне кажется, что они по сути являются «черными ящиками», которые не могут быть перепроектированы волей-неволей? Или я не понимаю? –

+0

Это виртуальная машина, о которой мы говорим? Поскольку 512 МБ ОЗУ в эти дни кажется из другого мира ... –

ответ

4

Переход от набора отдельных процессов к одному процессу обычно не является просто вопросом «переключения переключателя». Они принципиально разные архитектуры:

  • нитей, которые принадлежат к же процесса доли определенных ресурсов (объем памяти, дескрипторов файлов и т.д.), которые они могут «видеть» среди друг друга; они могут общаться друг с другом и обмениваться данными друг с другом очень «легким» способом;
  • различные процессы являются более «изолированными» единицами до некоторой степени: они не могут просто «заглядывать» в память друг друга, обрабатывать файлы и т. Д., А скорее должны взаимодействовать друг с другом «более тяжелыми» способами (например, через сокеты или другие объекты, предоставляемые ОС).

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

Итак, я хотел бы предложить ознакомиться с документацией по различным компонентам и узнать, позволяют ли они указать размер виртуальной машины (или «размер кучи») при запуске, а затем попытаться получить компоненты до как минимум, они требуют. (Ваш процесс регистрации, по-видимому, не нуждается в сотнях мегабайт ...)

Windows в принципе не должна «выключать процесс, потому что в нем заканчивается память». Это может начаться, как черт возьми, если ему нужно поменять местами кучи JVM в виртуальной памяти [*]. Но он не должен фактически закрывать процессы. С другой стороны, данное приложение Java может решить закрыть (или закрыть по умолчанию поведение в зависимости от обработки исключений), если он получает OutOfMemoryError при попытке выделить память из своей кучи. Что делает журналы для различных компонентов?

[*] В отличие от нативных приложений, Java-приложения не справляются с виртуальной памятью, потому что для Java его память представляет собой единую «кучу», которую она всегда ожидает, чтобы ее всегда выставляли. Вам следует избегать выделения общей кучи размер вашего JVM, который близок или больше объема физической памяти в машине.

1

Я сознательно не рассматриваю аспекты, уже охваченные ответом Нила Коффи.

Итак, каждое из этих приложений Java запускается в их собственной JVM (насколько мне известно). Первый вопрос: могу ли я уменьшить использование памяти этих четырех приложений, запустив их в одной JVM вместо четырех. Если да, то это потоки, которые я должен использовать для запуска каждого из этих приложений?

Нет, или не легко (см. Ответ Нила Коффи).

Но вы можете настроить параметры памяти java для каждого из этих .bat, передав аргументы командной строки программе java.exe.

Учитывая, что у вас довольно ограниченная настройка памяти, и если у вас есть хотя бы Java SE 6 Update 10, я бы рекомендовал вам попробовать G1 Garbage Collector, с помощью которого вы можете получить достойную производительность при относительно низких настройках памяти.

Может быть, попытаться передать что-то вроде этого, и корректировать, если это необходимо:

-Xss64k -Xms128m -Xmx128m -XX:PermSize=64m -XX:MaxPermSize=64m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:+UseCompressedStrings -XX:+UseCompressedOops 

Обратите внимание, что XX:+UseCompressedOops только для 64-разрядных виртуальных машин, и что он (а также - XX:+UseCompressedStrings) не может работать для вас в зависимости на вашей версии JVM. Кроме того, вы не говорите, если это для производства или личного использования. Если для использования в производстве я бы рекомендовал вам оставить эти 2 отдельно и просто использовать материал до -XX: + UseG1GC`.

Вышеупомянутый вариант изменения, который я использую, когда мне нужно запускать несколько экземпляров Eclipse на одной машине, создавая более крупные проекты с 2 ГБ ОЗУ. К сожалению, ваша среда немного сложнее, но попробуйте с этим одним приложением одновременно и посмотрите, сколько вы можете сжать и адаптировать.

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

Кроме того, что является первой основной вещью, которую я должен сделать, чтобы снизить объем памяти, являющийся совершенно новым для «реального» Java-программирования, как и я. H2, повторно использовать объекты и что еще? Jconsole и этот материал Xmx?

H2 уже довольно легкий, звучит как хороший выбор.

JConsole вам не поможет, но вы можете сделать снимок JVisualVM, он может немного помочь профилировать вещи. Или прицелитесь в JProfiler, если вы можете себе это позволить. В противном случае Eclipse имеет хороший анализатор памяти.

Пропорционально наивно, но я действительно думал, что эй, GC позаботится обо мне обо всем. Думаю нет? =)

Это не волшебство, оно просто восстанавливает неиспользуемые объекты. Если у вас есть ссылки на них, они не могут знать, нужны ли вам они или нет. Поэтому либо убедитесь, что ссылки не поддерживаются (как правило, путем хранения коллекций или взаимосвязанных составных объектов), или если вам нужны долговечные, возможно, посмотрите на слабые или мягкие ссылки (или на реализацию кэша).

Редактировать: Бэкэнд HMI использует веб-сервер Jetty. Кроме того, весь код является либо Open Source, либо построен мной.

Дайте нам более подробную информацию, и мы можем копать дальше.


Еще одна вещь, которую вы можете сделать - это посмотреть на альтернативные JVM. Есть несколько встроенных систем, которые, очевидно, имеют довольно ограниченные среды.


В зависимости от сложности заданий планирования, вы можете свернуть свой собственный планировщик без необходимости зависеть от кварца. Это не особо тяжелый вес, но если вам нужно сжать каждый MB, это будет первый элемент в вашем списке, который я попытаюсь избавиться.

Смежные вопросы