Проблема заключалась в том, что я запускал командный файл не из локальной папки, а через само приглашение cmd.
Оказывается, что часть "кучи" становилась выгруженной к диску, так, чтобы сборка "мусора" должна была вытянуть набор данных от диска назад в память.
Я разрешил это путем устанавливания "swappiness" параметра Linux на 0 (так, чтобы он не выгружал данные к диску).
Во-первых, проверьте Java SE 6 HotSpot [TM] Настраивающая документация Сборки "мусора" Виртуальной машины, если Вы уже не сделали так. В этой документации говорится:
параллельный коллектор делает большую часть своей трассировки и развертки работы с потоками приложения, все еще работающими, поэтому только краткие паузы замечены потоками приложения. Однако, если параллельный коллектор не может закончить исправлять недостижимые объекты, прежде чем штатное поколение заполнится, или если выделение не может быть удовлетворено доступными бесплатно блоками пространства в штатном поколении, то приложение приостанавливается, и набор завершается со всеми остановленными потоками приложения. Неспособность завершить набор одновременно упоминается как параллельный отказ режима и указывает на потребность скорректировать параллельные параметры коллектора.
и немного позже...
Параллельный коллектор приостанавливает приложение дважды во время параллельного цикла сбора.
Я замечаю, что те GCs, кажется, не освобождают особую память. Возможно, многие Ваши объекты долговечны? Можно хотеть настроить размеры поколения и другие параметры GC. 10 ГБ являются огромной "кучей" по многим стандартам, и я наивно ожидал бы, что GC займет больше времени с такой огромной "кучей". Однако, 1 секунда является очень долгим временем паузы и указывает, что или что-то неправильно (Ваша программа генерирует большое количество ненужных объектов или генерирует трудно исправляемые объекты или что-то еще), или просто необходимо настроить GC.
Обычно, я сказал бы кому-то, что, если они должны настроить GC затем, у них есть другие проблемы, которые они должны решить сначала. Но с приложением этого размера, я думаю, что Вы попадаете в территорию "необходимости понять GC намного больше, чем средний программист".
Как другие сказали, необходимо представить приложение для наблюдения, где узкое место. Действительно ли Ваш PermGen является слишком крупным для места, выделенного к нему? Вы создаете лишние объекты? jconsole работает, чтобы, по крайней мере, показать минимум информации о VM. Это - начальная точка. Как другие указали однако, Вам очень вероятно нужны более усовершенствованные инструменты, чем это.
Удачи.
Так как Вы упоминаете свое требование кэшироваться, я предполагаю, что большая часть Вашей огромной "кучи" занята тем кэшем. Вы могли бы хотеть ограничить размер кэша так, чтобы Вы были уверены, что он никогда не пытается стать достаточно большим для заполнения штатного поколения. Не полагаться SoftReference
один для ограничения размера. Поскольку старое поколение заполняется мягкими ссылками, более старые ссылки будут очищены и становиться мусором. Новые ссылки (возможно, к той же информации) будут созданы, но очищены быстро, потому что свободное пространство в дефиците. В конечном счете штатное пространство полно мусора и должно быть убрано.
Рассмотрите корректировку -XX:NewRatio
установка также. Значение по умолчанию 1:2, означая, что одна треть "кучи" выделяется новому поколению. Для большой "кучи" это почти всегда слишком много. Вы могли бы хотеть попробовать что-то как 9, который сохранит 9 Гбит Вашей "кучи" на 10 Гбит для старого поколения.
Вот некоторые вещи, которые я нашел, который мог быть значительным.
Используя эти подходы, задержка вызова RPC может быть уменьшена до ниже с 200 микросекундами, и времена GC уменьшили до 1-3 мс, производящих меньше, чем 1/300 вызовов.
Некоторые места, чтобы начать смотреть:
Также я выполнил код через профилировщика.. Мне нравится тот в NetBeans, но также существуют другие. Можно просмотреть поведение gc в режиме реального времени. Визуальный VM делает это также..., но я еще не выполнил его (поиск причины для..., но еще не имели времени или потребности).
Несколько вещей, что я надеюсь, могут помочь:
У меня никогда не было большой удачи с ConcurrentCollector, в теории это жертвует пропускной способностью за усиление уменьшенной задержки, но я нашел лучшую удачу с коллектором пропускной способности и для пропускной способности и для задержки (с настройкой, и для моих приложений).
Ваш Кэш Мягких Ссылок является чем-то вроде опасной идеи для Коллекторов Поколений и является, вероятно, одной причиной почему Ваши молодые наборы поколения arn't собирающий слишком много мусора.
Если я не ошибусь, неважно, насколько недолгий Объект, если он будет помещен в кэш (который наверняка превратил его в Штатное Поколение), то это будет живо, пока FullGC не произойдет, даже если никакие другие ссылки на него не существуют!
То, что это означает, является Вашими объектами, которые живут в молодом генерале, которые помещаются в кэш, теперь копируются многократно, поддерживаются, поддерживая их ссылки, и обычно замедляя youngGen GC.
Его довольно парадоксальное, как кэширование может уменьшить объектное выделение, но увеличить время GC.
Можно также хотеть попытаться корректировать отношение оставшегося в живых, это могут быть слишком маленькие переполняющиеся еще более 'молодые' объекты в штатное поколение.