запустить командную строку jar с максимальными ресурсами - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь запустить флягу, которая работает на 100M строках записей.Я ударил GC overlimit.Работает на 10М без проблем.

Я знаю, что лучше всего найти место, где происходит переполнение

Я хочу один раз попробовать запустить jar на сервере, предоставляя ему максимальные ресурсы в динамической памяти, памяти GC и т. Д.

Я пытался запустить мой jar -xms и -xmc

java -Xmx256m -Xmc256m -jar myapp.jar // что-то в этом роде

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

Я также пытался использовать многопоточность с помощью этой команды

java -jar -Xmx30024m -XX: ParallelGCThreads= 12000 myapp.jar

Но я не уверен, насколько это будет работать.

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

1 Ответ

0 голосов
/ 11 октября 2018

Проблема не в сборщике мусора, сборщик мусора работает быстро.GC выдаст эту ошибку только тогда, когда у вас уже есть нет памяти .30 ГБ определенно будет достаточно для 100 миллионов записей, если только они не большие.Каков размер каждой записи?Я бы попробовал:

1) Убедитесь, что у вас есть 64-битная Java, и перезапустите ваш код, если вы случайно использовали 32-битную Java

2) Вытащите объекты из вашего внутреннего цикла / оптимизируйте распределение объектов, Т. Е. Использовать .clear ();не делайте новый массив.Разделите самый внутренний цикл, который делает много, на несколько разных циклов с меньшим количеством объектов, которые должны быть выделены на одну итерацию.

3) Попробуйте сделать свою работу инкрементной, то есть использовать сортировку слиянием вместо быстрой сортировки.Таким образом, вы можете разделить работу между несколькими экземплярами ввода по 10M и сохранить каждый пошаговый прогресс перед объединением в ответ 100M.

4) Кодировать его в C / C ++ / Rust, чтобы он использовал стек вместокуча для временных переменных.Если вы не используете «new» где-либо в самом внутреннем цикле версии Java, вам может потребоваться еще больше сжать данные.Оцените использование памяти с 5M, 10M, 15M записями, чтобы получить влияние каждой записи на байт (наклон линии, проходящей через эти три точки), и посмотрите, можете ли вы представить себе возможность сохранять каждую запись с меньшим количеством байтов, если у вас былоконтроль каждого байта индивидуально на системном языке (и посмотрите, будет ли это значение по-прежнему меньше, чем объем вашей оперативной памяти).

5) Если ваши записи большие (> 1 КБ), вы определенно хотите сделатькэш.Используйте метод получения для доступа к каждой записи, а не напрямую из массива, и не используйте объем памяти.Попросите получателя получить доступ к простому массиву ссылок 100M и ограничьте себя тем, чтобы 90M из них были NULL.Если вы пытаетесь получить доступ к новой записи, когда 10M уже используется, то установите случайную / редко используемую существующую запись в NULL, прежде чем получить доступ к диску, кэшировать значение и вернуть запрошенную запись.Убедитесь, что ваш алгоритм хорошо подходит для этого кэширования (более слабое требование, чем предложение № 3, но в принципе то же самое).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...