LINUX.ORG.RU

ЖАБА съела мою память!

 , , , ,


0

0

Здравствуйте, объясните мне, почему любое приложение на этом языке протекает? Вот запускаешь ты его, сразу 400 уходит, хотя там 100 за глаза, ну ладно. Через пару часов это уже 4000 (при этом всё работает нормально). Но далее закономерно начитаются проблемы, даже если памяти избыток.

В частности, это касается игрушек, Runescape там, Wakfu и остальное. В определённый момент, всё начинает сильно, всё сильнее и сильнее, подвисать, тормозить и зависать. Причём, никакие игры с ключами, ограничениями памяти, переключениями режимов GC и прочим таким, ни к чему не приводят — становится только хуже. Например, можно начинать с самого начала: сделать чтобы GC приходил почаще и вёл себя агрессивней. Подфриживания будут чаще и с самого начала, но при этом памяти хватит на дольше (вроде бы). Это продолжается уже много-много лет. Неужели это происходит только у меня и никто этого не видит?

И попутно, у оракловской сборочки есть панель управления приложениями с профайлером и прочими ништяками, можно ли иметь что-нибудь похожее для openjdk? Мне она не нужна, просто интересно.

Может ты уже перестанешь ныть и подумаешь о том, что это не приложение, а виртуальная машина с собственным механизмом работы с памятью ?

Если включать мозг не хочешь, тебе будет достаточно -Xmx и gcutil

router ★★★★★ ()
Ответ на: комментарий от router

Да ну, перестаньте, я обычный пользователь и разработчик уже подумал о том как должно работать его приложение. А ещё он вставляет палки в колёса, чтобы его интеллектуальную собственность было не так просто запустить с произвольными параметрами ВМ. И нет, не достаточно.

linuxnewbie ()
Ответ на: комментарий от Bad_ptr

Мне встречались кривые текущие скрипты на сайтах, однако браузеры ТАК не текут. Вот порнобаннеры на флэше как сейчас помню выжирали всё до чего добирались, но с тех пор весь вэб засунули в песочницы и стало получше.

linuxnewbie ()
Ответ на: комментарий от Bad_ptr

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

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

Подумал. Его приложение работает в виртуальной машине определённой версии.

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

router ★★★★★ ()
Ответ на: комментарий от router

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

linuxnewbie ()
Ответ на: комментарий от router

Чёт не работает, через 5 минут уже 1 гигабайт, хотя ограничение ставлю и 512, и 256, и 128, и даже 64 (меньше всего потребление на старте). И никогда не работало. Я не знаю откуда вы это берёте, сами то пробовали?

linuxnewbie ()

Подфриживания будут чаще и с самого начала, но при этом памяти хватит на дольше (вроде бы).

Не знаю кто пишет игры но по наблюдениям за жабо девелоперами с опытом менее года практически всегда косячат с использованием hashmap и hashset. Либо не переопределяют hashCode либо делают ключ мутабельным и привет утечка памяти. GC в этом случае не спасет.

anonymous ()

Профайлером подсоеденяться к жвм с приложухой и смотреть какие объекты плодятся и в каком количестве. А потом в это вот все тыкать носом разраба. Не раз уже так чинили протечки в софте.

TaV0x222 ()
Последнее исправление: TaV0x222 (всего исправлений: 1)

Это только у тебя. У меня одно приложение работает месяцами с -Xmx32m. Кстати лопатит файлы в сотни мегабайтов периодически. Фокус-покус!

Legioner ★★★★★ ()
Ответ на: комментарий от router

Не, ява стабильно в свои лимиты влазит. То есть у неё случится OutOfMemoryError, но не съест больше, чем выделено системой. Может течь только сама виртуальная машина, но за ней замечено не было.

turtle_bazon ★★★★ ()
Ответ на: комментарий от Bad_ptr

то же самое с браузерами написанными на C++ и их яваскриптами

Там присутствует проблема фрагментации и неперемещаемости выделенной памяти в технологиях софтописания 40-летней давности, когда половина памяти выделялась статически, а вторая половина потихоньку выделялась динамически, и скорость утечки страниц памяти падала по мере повышения фрагментированности и появления достаточно больших дырок в страницах. Эта проблема неактуальна для молодой и бодрой жабы, которой всего-лишь 20 лет, и в которой недавно стало возможно уплотнять выделенную память без остановки работы кода.

Свет в конце тонеля есть, но не всегда:
https://stackoverflow.com/questions/30458195/does-gc-release-back-memory-to-os
https://developer.ibm.com/javasdk/2017/09/25/still-paying-unused-memory-java-...
От утечек или бездарной работы макаки с GC ничего не спасет, конечно же.

byko3y ()
Ответ на: комментарий от Pinkbyte

Там libgdx с lwjgl, ручное обновление бандленных на ночнушки не помогло (я знаю что с renpy это хорошо работало). В профайлере что-то мутное, маячит как раз gdx из того что можно разобрать. Подождём пока разраб соизволит мигрировать на lwjgl3, там видно будет. Можно её как-то ограничить, чтобы она падала? Или лучше чтобы появлялось модальное окно с фокусом, с предложением перезапустить процесс, когда израсходуем 2 гигабайта.

linuxnewbie ()

Алё, докинь оперативной памяти до 192 GB и купи процессор не ниже Core i9. Тогда тормозить не будет, так как вся память не успеет забиться в пределах твоей сессии.

EXL ★★★★★ ()
Ответ на: комментарий от linuxnewbie

GC не может управлять памятью нативных библиотек. Посмотрите в VisualVM на что ушла память если в VisualVM не видно, что дофига памяти отожрано хипом то это нативные библиотеки.

mythCreator ()
Ответ на: комментарий от mythCreator

250 мегабайт, 75 мегабайт после гц. Видимо дело не в библиотеках? Единственное, что вижу подозрительное, это

NameAllocated bytesAllocated bytes / sec
LWJGL Application10 239 848 248 B (86,6 %)0 B (0 %)

памяти хорошо так за 2 гигабайта ушло, и вот это всё что осталось

NameAllocated bytesAllocated bytes / sec
AssetManager1 327 729 880 B (11,2 %)0 B (0 %)
RMI TCP Connection(4)-127.0.0.1270 391 240 B (2,3 %)292 552 B (29,3 %)
linuxnewbie ()

Всё нормально. Явакодеры думали, что с памятью все проблемы решены и ничего делать не надо. А оказывается можно легко протупить с ссылками, память будет постоянно выжираться и на яве нужно думать в 2 раза больше - за себя и за вм.

crutch_master ★★★★★ ()
Ответ на: комментарий от linuxnewbie

Видимо мне очень везёт, поскольку вижу это я десятилетиями.

Так gamedev - это те еще макаки. Они хотят сделать шляпы, чик чик и в стим, а не проблемы с памятью и архитектурой решать.

crutch_master ★★★★★ ()
Ответ на: комментарий от linuxnewbie

Можно и не так. В дотке, например, до сих пор не пофиксили баги при перемотке реплея. Проводят турниры миллионами призовых, зарабатывают кучу бабла на шляпах, а кастеры страдают и всем насрать.

crutch_master ★★★★★ ()
Ответ на: комментарий от linuxnewbie

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

const s = 'строка 50 мб'
// вот кажется после этого освободится 50 мб оперативки, 
// авотх*й
s = s.substr(0, 5)

Возможно, в Java что-то подобное. Плюс только в том, что мы можем сделать хоть тысячу подстрок, памяти они будут ненамного больше 50 мб занимать.

tz4678 ()
Ответ на: комментарий от crutch_master

Так gamedev - это те еще макаки. Они хотят сделать шляпы, чик чик и в стим, а не проблемы с памятью и архитектурой решать.

Извините меня, господа, а разве не для этого сделана жаба? Чтобы индус написал модуль расчета банковского мультипликатора для Chase Capital, он работал достаточно быстро, и он при этом по минимуму глючил. Ну да, оперативу жрет - докинем еще 100 Гб, и проблема решена. В крайнем случае нежно перезапускать по тригеру.
Если посмотреть на то, как оракл затачивает JVM, то можно сделать вывод, что типичное жабоприложение это:
- однопоток или независимая многопоточность;
- короткоживущие или не выделяющие память процессы.
Я тут набрел на страницу, где описываются типичные вопросы на собеседовании. Меня порадовало, что якобы для соискателя уровня senior задаются вопросы про дедлоки в многопоточке. Я до сих пор не верю, вы это серьезно? Я знаю про дедлоки и разруливал очень тяжелые дедлоки шанса 1/1000 в сторонних библиотеках, я теперь Senior Enterprise Developer со стажем 8 лет?

byko3y ()
Ответ на: комментарий от crutch_master

В дотке, например, до сих пор не пофиксили баги при перемотке реплея. Проводят турниры миллионами призовых, зарабатывают кучу бабла на шляпах, а кастеры страдают и всем насрать.

Не обижай дотку, пожалуйста, а то я буду обижать тебя. На фоне остального говна дотка одна из немногих сделана качественно, и, например, по-настоящему эффективных читов под нее не придумали.
Нужно понимать, что с целью повышения производительности клиент обрабатывает только старт и остановку анимации, но точно обработать все варианты ее срабатывания было тяжело даже в прямом направлении (иногда багает), а ты просишь в обоих направлениях. Я хочу подчеркнуть, что нынче в простой игре (не в реплее) используется 2 варианта течения событий: простое воспроизведение и промотка вперед после пропущенных пакетов. Изредка подглючивает именно второе, первое же фундаментально и работает безупречно.
Я пишу это скорее потому, что я ни копейки не отдал вольве, и я еще не настолько деградировал, чтобы смотреть игру других вместо того, чтобы самому играть. Это же даже не футбол, где нога болит, или покушал недавно и от фарма живот болит.

byko3y ()
Ответ на: комментарий от byko3y

Они хотят сделать шляпы, чик чик и в стим

Извините меня, господа, а разве не для этого сделана жаба?

Извиняю. Не для этого.

якобы для соискателя уровня senior задаются вопросы про дедлоки в многопоточке.

я теперь Senior Enterprise Developer со стажем 8 лет?

Зависит от твоих ответов

Kokonavtuz ()
Ответ на: комментарий от tz4678

подстрока на самом деле всегда содержит ссылку на исходную строку

В V8 сделали большое кол-во оптимизаций, расчитывая на некоторые типичные use-case. Упомянутый тобой вариант является наивной оптимизацией, которая работает в простых случаях, поскольку строка в самом деле не изменяется. Ошибка разрабов здесь в том, что GC должен был бы реструктуризировать такие строки, но сделать это геморно, потому баг у V8 висит уже 6 лет
https://bugs.chromium.org/p/v8/issues/detail?id=2869
А в JDK просто забили болт и с седьмой версии тупо отключили эту оптимизацию.

byko3y ()
Ответ на: комментарий от byko3y

например, по-настоящему эффективных читов под нее не придумали.

Это не заслуга реализации. Просто дотка игра такая, что там не развернешься с читами особо.

Нужно понимать, что с целью повышения производительности клиент обрабатывает только старт и остановку анимации, но точно обработать все варианты ее срабатывания было тяжело даже в прямом направлении (иногда багает)

Там дело не в анимации. Реплей это просто массив действий юнитов на каждый фрейм.

и я еще не настолько деградировал, чтобы смотреть игру других вместо того, чтобы самому играть

Ох, как тебе припекло-то.

crutch_master ★★★★★ ()
Ответ на: комментарий от Kokonavtuz

Извиняю. Не для этого.

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

я теперь Senior Enterprise Developer со стажем 8 лет?

Зависит от твоих ответов

Зависит от того, создам ли я впечатление восторженного гика, умеющего и желающего писать очень хороший, важный и нужный код (нет) за скромное вознаграждение, вроде 30$/час. И да, у меня попка подгорает с того, что индустрия забита бездарями, которые были отобраны не по способности писать код, а по ответам на вопросы собеседования. И в итоге в объявлениях можно найти соискателей вроде «руководил работой 5 команд с общей численностью 45 человек, успешно угробил все эти проекты и был уволен, успев хорошо заработать на каждом» или «имею богатый опыт уничтожения проектов до состояния микросервисов. Охотно разрушу ваш сервис до микросервисов за 40$/час» - и таки кто-то на это купится.

byko3y ()
Ответ на: комментарий от byko3y

Извините меня, господа, а разве не для этого сделана жаба?

Нет же. Жабу делали, чтобы еще лучше абстрагироваться от железа. Знаковые целые по дефолту, одинаковые размеры флоатов везде и т.д. Потом всё пошло не туда и сейчас мы имеем десткопный жабасофт x86 и amd64.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Это не заслуга реализации. Просто дотка игра такая, что там не развернешься с читами особо.

Maphack был настоящим бедствием. Вместо модели steplock теперь каждый клиент получает огрызки игрового мира и локально предсказывает будущие события, корректируя результат под новую приходящую с сервера информацию. Как ты понимаешь, здесь уже есть нелинейность сценария, которую не так-то просто реализовать, клиент постоянно отматывает игру обратно и переигрывает с новыми входными данными.

Там дело не в анимации. Реплей это просто массив действий юнитов на каждый фрейм.

Реплей не может хранить отдельные тики анимации для каждого юнита - тогда размер реплея был бы чудовищен. Сейчас реплей сохраняет примерно 1 Мб данных каждую минуту, или 300 байт каждый тик. Чтобы сохранить состояние всех анимаций всех юнитов, всех положений камер и курсоров мышки 10 игроков на протяжении всей игры понадобятся гигабайты памяти, а также отдельная версия клиента, заметно отличающаяся от обычного релиза.
Просмотр игры с сервера (читай «игра на сервере») отличается, потому что сервер и вправду хранит все эти состояния, но в оперативной памяти и только для короткого промежутка времени. Серве может отдавать полный снимок клиенту, но только по запросу, потому что инфы много и канал не резиновый, а излишние переданные данные повышают задержку.
Давай лучше мы пойдем от противного: назови мне многопользовательскую игру с растянутыми во времени явлениями, в которой сделано безупречное проматывание в любую точку времени с сохранением правильного промежуточного состояния протяженных явлений. Потому что я таких не знаю, например.

и я еще не настолько деградировал, чтобы смотреть игру других вместо того, чтобы самому играть

Ох, как тебе припекло-то.

Да, я не смотрю интернешнл. Я играю для удовольствия, а не для идентификации себя с чемпионами, выигравшими кучу бабла; я не представляю, как все завидуют тому, какой я крутой и сколько бабок выиграл. У меня был культурный шок, когда я первый раз вживую увидел кадра, который всерьез говорил про то, что дота - это круто, потому что кто-то там выиграл миллион.

byko3y ()