Настройка JVM
Ядром платформы Java является виртуальная машина Java (JVM).Весь сервер приложений Java работает внутри JVM.JVM принимает много параметров запуска в качестве флагов командной строки, и некоторые из них имеют большое влияние на производительность приложения.Итак, давайте рассмотрим некоторые важные параметры JVM для серверных приложений.
Во-первых, вы должны выделить как можно больше памяти для JVM, используя флаги -Xms (минимальная память) и -Xmx (максимальная память).Например, тег -Xms1g -Xmx1g выделяет 1 ГБ ОЗУ для JVM.Если вы не укажете размер памяти в флагах запуска JVM, JVM ограничит объем памяти кучи 64 МБ (512 МБ в Linux), независимо от того, сколько физической памяти у вас на сервере!Больше памяти позволяет приложению обрабатывать больше параллельных веб-сеансов и кэшировать больше данных, чтобы улучшить медленный ввод-вывод и операции с базой данных.Обычно мы указываем одинаковый объем памяти для обоих флагов, чтобы заставить сервер использовать всю выделенную память при запуске.Таким образом, JVM не нужно будет динамически изменять размер кучи во время выполнения, что является основной причиной нестабильности JVM.Для 64-битных серверов убедитесь, что вы запускаете 64-битную JVM поверх 64-битной операционной системы, чтобы использовать всю оперативную память на сервере.В противном случае JVM сможет использовать только 2 ГБ или меньше памяти.64-разрядные JVM обычно доступны только для JDK 5.0.
При большой куче памяти операция сбора мусора (GC) может стать основным узким местом производительности.GC может пройти более десяти секунд, чтобы пройти через кучу в несколько гигабайт.В JDK 1.3 и более ранних версиях GC является однопоточной операцией, которая останавливает все другие задачи в JVM.Это не только вызывает длительные и непредсказуемые паузы в приложении, но также приводит к очень низкой производительности на многопроцессорных компьютерах, поскольку все остальные процессоры должны ждать в режиме ожидания, пока один процессор работает на 100%, чтобы освободить пространство кучи памяти.Крайне важно, чтобы мы выбрали JVK JDK 1.4+, который поддерживает параллельные и параллельные операции GC.На самом деле, параллельная реализация GC в JVM серии JDK 1.4 не очень стабильна.Поэтому мы настоятельно рекомендуем вам обновить JDK до версии 5.0.Используя флаги командной строки, вы можете выбрать один из следующих двух алгоритмов GC.Оба они оптимизированы для многопроцессорных компьютеров.
- Если вашим приоритетом является увеличение общей пропускной способности приложения, и вы можете допускать случайные паузы GC, вам следует использовать -XX: UseParallelGC и -XX: Использовать флаги ParallelOldGC (последний доступен только в JDK 5.0) для включения параллельного GC.Параллельный GC использует все доступные процессоры для выполнения операции GC, и, следовательно, он намного быстрее, чем однопоточный GC по умолчанию.Однако он по-прежнему приостанавливает все другие действия в JVM во время GC.
- Если вам нужно минимизировать паузу GC, вы можете использовать флаг -XX: + UseConcMarkSweepGC для включения одновременного GC.Параллельный GC по-прежнему приостанавливает JVM и использует параллельный GC для очистки недолговечных объектов.Однако он очищает долгоживущие объекты из кучи, используя фоновый поток, работающий параллельно с другими потоками JVM.Параллельный сборщик мусора значительно уменьшает паузу сборщика мусора, но управление фоновым потоком увеличивает нагрузку на систему и снижает общую пропускную способность.
Кроме того, есть еще несколько параметров JVM, на которые можно настроитьоптимизировать операции GC.
- В 64-разрядных системах стеку вызовов для каждого потока выделяется 1 МБ пространства памяти.Большинство потоков не используют столько места.Используя флаг -XX: ThreadStackSize = 256 КБ, вы можете уменьшить размер стека до 256 КБ, чтобы разрешить больше потоков.
- Используйте флаг -XX: + DisableExplicitGC, чтобы игнорировать явные вызовы приложения System.gc ().Если приложение вызывает этот метод часто, то мы могли бы сделать много ненужных сборщиков мусора.
- Флаг -Xmn позволяет вам вручную установить размер "молодого"«пространство памяти поколения» для недолговечных объектов. Если ваше приложение генерирует много новых объектов, вы можете значительно улучшить ГХ, увеличив это значение. Размер «молодого поколения» почти никогда не должен превышать 50% кучи.
Поскольку GC оказывает большое влияние на производительность, JVM предоставляет несколько флагов, которые помогут вам точно настроить алгоритм GC для вашего конкретного сервера и приложения. В этой статье обсуждаются алгоритмы GC и советы по настройке.подробно, но мы хотели бы отметить, что JVK JDK 5.0 поставляется с функцией адаптивной настройки GC, называемой эргономикой, которая может автоматически оптимизировать параметры алгоритма GC на основе базового оборудования, самого приложения и желаемых целей, определяемыхпользователь (например, максимальное время паузы и желаемая пропускная способность). Это экономит ваше время, когда вы сами пытаетесь использовать различные комбинации параметров GC. Эргономика - еще одна веская причина для перехода на JDK 5.0. Заинтересованные читатели могут обратиться к разделу «Настройка мусора».ollection с виртуальной машиной Java 5.0.Если алгоритм GC настроен неправильно, выявить проблемы на этапе тестирования вашего приложения относительно легко.В следующем разделе мы обсудим несколько способов диагностики проблем GC в JVM.
Наконец, убедитесь, что вы запускаете JVM с флагом -server.Он оптимизирует компилятор Just-In-Time (JIT) для торговли с более медленным временем запуска для более быстрой производительности во время выполнения.Есть еще флаги JVM, которые мы не обсуждали;Подробнее об этом см. на странице документации по опциям JVM.
Ссылка: http://onjava.com/onjava/2006/11/01/scaling-enterprise-java-on-64-bit-multi-core.html