LINUX.ORG.RU

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

 , , , ,


0

0

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

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

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



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

На телефонах та же фигня по-моему, периодически приложения начинают жрать слишком много и убиваются.

linuxnewbie
() автор топика

У тебя никогда не случится буффер оверфлоу, если ты будешь делать вид, что буферу нет конца.

anonymous
()

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

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

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

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

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

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

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

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

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

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

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

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

у меня такого нет кстати, где искать?

в гугле

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

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

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

печально. ну значит спасенья нет, только сабж

router ★★★★★
()

Даже если приложение на жабе будет течь, то всё равно съест не больше, чем жвм позволит. Там протекает где-то на другом уровне

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

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

linuxnewbie
() автор топика

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

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

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

нативные библиотеки, может в этом дело?

вполне может быть

А как исправить?

Средствами экосистемы Java? Никак

Pinkbyte ★★★★★
()

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

VisualVM.

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

Мне ограничивающие ключи помогают

anonymous
()

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

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

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

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

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

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

Может быть дело в нативных библиотеках. Но как исправить, не исправляя библиотеки - не знаю.

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
() автор топика
Ответ на: комментарий от iZEN

Здорово, спасибо. Что-то не то со шрифтами, конечно, но работает. Ничего особо полезного не вижу.

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

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

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

На телефонах та же фигня по-моему, периодически приложения начинают жрать слишком много и убиваются.

Там let it crash подход.

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

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

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

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

Да вроде Вакфу серьёзная контора разрабатывает не первое десятилетие, и вообще они деньги за это дерут (и не малые), разве так можно?

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

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

crutch_master ★★★★★
()

Ты так хорош, что даже жабы текут при виде тебя

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

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

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

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

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

До Вакфу они делали Dofus она адобовских технологиях. Это всё, что нужно о них знать.

turtle_bazon ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от byko3y

Хотя насчёт индусов ты прав. Ну вот, мы имеем индусоигры, которым надо докинуть еще 100гб.

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

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

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

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

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

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

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

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

byko3y ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.