powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по расходу памяти
26 сообщений из 26, показаны все 2 страниц
Вопрос по расходу памяти
    #39705127
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть специфичное приложение на яве, если в кратце - это http прокси.
Запущен с параметрами xms=2g, xmx=8g
Почему черзе некоторое время работы хип раздувается до этих 8 гигов? Почему gc раньше мусор не подчищает?
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705131
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У программы есть кэш свой, и не очень понятно из вне, сколько реально программе нужно памяти чтобы удерживать необходимый размер кэша.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705214
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или это мемори лик?
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705215
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем ему подчищать? Ты разрешил пухнуть до 8 . Вот. Пухнет.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705227
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был раньше кэширующий прокси на Яве, но вел себя хорошо по ресурсам (наверное руками писали)

Кажется этот
http://scache.sourceforge.net
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705233
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglБыл раньше кэширующий прокси на Яве, но вел себя хорошо по ресурсам (наверное руками писали)

Кажется этот
http://scache.sourceforge.net

Да у меня тута весьма специфичный софт, не просто прокси, так что это не велосипед.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705235
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА зачем ему подчищать? Ты разрешил пухнуть до 8 . Вот. Пухнет.

У другой софтины, которая переваривает сравнимо больший трафика такого явления не наблюдаю.

Я правильно понимаю, что реально сейчас используется 2гб хипа?
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705257
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettmaytonА зачем ему подчищать? Ты разрешил пухнуть до 8 . Вот. Пухнет.

У другой софтины, которая переваривает сравнимо больший трафика такого явления не наблюдаю.

Я правильно понимаю, что реально сейчас используется 2гб хипа?
Покажи что показывает jvisualvm.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705476
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключился удаленно, похоже все нормально.

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

Почему "ручной" вызов gc подчищает больше мусора?
Зачем jvm держит лишний мусор, а не удаляет его сразу, как делает это при "ручном" вызове сборщика?
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705521
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЕсть специфичное приложение на яве, если в кратце - это http прокси.
Запущен с параметрами xms=2g, xmx=8g
Почему черзе некоторое время работы хип раздувается до этих 8 гигов? Почему gc раньше мусор не подчищает?

Можно посмотреть параметры "раздувания" / "сжатия" heap'а - по дефолту они достаточно агрессивные. Т.е. что бы Java отдавала память ОС, должно случится практически чудо. приложения фактически всю память должно освободить.
(если правильно помню, настройки при 70% занятой - раздувать и при < 30% - пытаться отдавать)

HettПочему gc раньше мусор не подчищает?

GC мусор то подчищать будет. Но даже в этом случае JVM память ОС может не отдавать (см выше)

Спросите у любого менеджера проекта - если какие-то ресурсы выделены, их нужно беречь и не в коем случае не отдавать обратно ))) Основы менеджмента )))

Hett xms=2g, xmx=8g
Если это реальный enterprise сервер, то передавать память туда-сюда-обратно-тебе-и-мне-приятно ( C ) мурзилка, не очень правильная стратегия

Выделить память сколько требуется всем службам и зафиксировать xms==xmx, в оптимале и своп даже можно выключить (но AFAIK лучше оставить, на случай чрезвычайных ситуаций, а то иногда даже и к консоле не подконектится)

Я бы еще дополнительно ручками бы зафиксировал young / old. Как разработчки, всякие automatic memory management не люблю. Т.к. я лучше знаю, какие требования к памяти моего приложения и самодеятельность JVM даром не нужна.

Если на сервере не хватает памяти для всех работающих служб - значит нужно upgrade'ить сервер.

HettПочему gc раньше мусор не подчищает?
Для инкрементного GC можно задать чистку мусора в фоне, просто по таймеру. Но инкрементный GC не выполняет дефрагментацию памяти, т.ч. смена GC и решение насколько осмысленно/можно на него переходить - требует тестирование (нагрузочного) приложения.

Да и вообще, инкрементным GC решают другую проблему (остановка приложения во время fullGc), Ваше же проблема, крайне надумана. Не выполняется - т.к. памяти достаточно и лишнию работу (запуск GC) делать не нужно.

Хотите, что бы GC запускался чаще - уменьшите память (xms == xmx=...). Хотите, что бы GC запускался режи - увеличьте память. (xms == xmx=...)

IMHO & AFAIK

Hett
Почему "ручной" вызов gc подчищает больше мусора?
Зачем jvm держит лишний мусор, а не удаляет его сразу, как делает это при "ручном" вызове сборщика?

Если вдруг увидел люк, не волнуйся, это глюк ( C )

Ручной вызов от не ручного различаться не должен. Может различаться minorGC и fullGC. Если у Вас fullGC не срабатывает, этому наоборот радоваться нужно.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705526
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я про возврат ресурсов и не говорю (хотя судя по графику и такое бывает).
Вот он работал работал, и раздул хип. Ну в общем-то если подумать о фрагментации памяти, то вроде все становится ясно. Ему просто не хочется лишний раз делать дефрагментацию наверное.

Я побольше поэкспериментировал, "ручной" вызов освобождает память, но если его вызывать повторно, то он еще освободит, и еще, в итоге из 1.5 гигабайт используемой памяти остается 40 мегабайт.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705528
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВыделить память сколько требуется всем службам и зафиксировать xms==xmx, в оптимале и своп даже можно выключить (но AFAIK лучше оставить, на случай чрезвычайных ситуаций, а то иногда даже и к консоле не подконектится)
На самом деле меня интересовал вопрос, не вывалится ли софт в OME, пока я буду спать. В общем-то научился пользоваться visual jvm, теперь я спокоен.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705545
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЯ побольше поэкспериментировал, "ручной" вызов освобождает память, но если его вызывать повторно, то он еще освободит, и еще, в итоге из 1.5 гигабайт используемой памяти остается 40 мегабайт.

Если вдруг увидел люк, не волнуйся, это глюк ( C )

1. увеличивается кол-во young чисток, соответственно возрастает возраст объектов в young (servivour) области - они могут начать вычищаться по счетчику возраста жизни. Вроде, по дефолту, объекту разрешается жить от 8 до 32 ротаций eden / servivour.
2. если есть всякие soft / weak reference - нужно читать. как они чистятся
3. если есть объекты выделяемые через JRMI (remote method invocation) - там вообще алгоритмы очистки "взрыв мозга". Даже после полбутылки не разберешься.

Пока ваша проблема надумана. Оно просто так работает.

Не очень понятно, какую проблему решаете. Оптимизируете скорость работы (т.е. что бы full GC запускался реже и паузы / время работы minor GC было быстрее), пытаетесь оптимизировать потребление памяти.

Я бы рекомендовал:
1. Смотреть по логу, а не про графикам
2. Ключивые показатели, IMHO & AFAIK:
2.1. частота запуска, время между запусками minor GC - оно не должно быть очень коротиким. В целом, одна "транзакция" работы HTTP-сервера должна быть быстрее, чем время между запусками minor GC, что бы "временные объекты" случайно не стали "постоянными"
- чем больше young, тем реже запускаемся. Память нужно увеличивать
2.2. время работы minor GC, т.е. пауза на сколько служба будет "стоять колом" при работе minor GC. Чем больше young область, тем время работы minor GC больше (что логично) - т.е. тут young память лучше уменьшать
2.3. кол-во объектов которые после запуска minor GC переносятся в old Gen. В оптимале, т.к. в HTTP-сервере большенство объектов живет только на время запроса, то если время между запусками minor GC достаточно большое. то должно стремится к 0
- увеличиваем young, можно поиграться eden / servivour но обычно это мертвому припарка.
2.4. кол-во памяти остающиеся после чистки full GC - в Вашем случае, занятая область это долгоживущий "кэш" Вашего приложения. Очищаемый размер - кол-во временных объектов просочивщихся в old Gem. Свободная память - она и есть свободная
2.5. частота запуска, время между запусками full GC - в оптимале, может быть вообще 1-2 раза в рабочий день. Сам настраивал enterprise биллинг (Oracle CC&B), изначально full GC работал раз в 15-30 сек, после ручного указания young / old, стал работать 1-2 раза за рабочий день. То, что у Вас full GC не запускается, это и хорошо ! так и надо )))

IMHO & AFAIK

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

Тут только одно ограничение для творчества: young всегда должно быть меньше oldGen. Т.к. AFAIK для HTTP-сервера, оптимально young задирать по максимому (young = oldGen или young = 1/2 oldGen), то можно получить не уменьшаемую/не используемую память в oldGen.

IMHO & AFAIK

p.s.
Теоретически есть automatic параметры, которые сами automatic распределение памяти в JVM могут делать исходя из нужных требований latency / throughinput, но я всегда только руками выставлял.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705555
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск в гугле по теме:

Does GC release back memory to OS?
https://stackoverflow.com/questions/30458195/does-gc-release-back-memory-to-os


HettавторВыделить память сколько требуется всем службам и зафиксировать xms==xmx, в оптимале и своп даже можно выключить (но AFAIK лучше оставить, на случай чрезвычайных ситуаций, а то иногда даже и к консоле не подконектится)
На самом деле меня интересовал вопрос, не вывалится ли софт в OME, пока я буду спать. В общем-то научился пользоваться visual jvm, теперь я спокоен.
Подозреваю, у Вас по графику вообще full GC не срабатывает. Т.е. памяти - дофига и больше )))

Тут скорее вопрос ее уменьшения, что бы лишние ресурсы сервера на себя не перетягивать и что бы в OS process killer не запустился, когда все службы распухнут до максимума ))).

p.s.
ну не люблю я xms < xmx. Есть память - выдайте приложениям, нет памяти - тут уже нужно начальство подключать, а не "перестраховываться" выставляя с запасом xmx. IMHO & AFAIK

p.p.s.
если на сервере много Java служб и много процессоров, крайне рекомендую руками выставлять кол-во слежубных thread'ов в JVM (чистка муссора, JIT компилятор, 2-4 потока вполне достаточно). Специфика работы JVM, оптимизация по дефолту: 1 сервер == 1 серверный enterprise процесс JVM, если на сервере 1 сервер == 100500 маленьких JVM'ок, то требуется руками аппетиты JVM урезать.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705566
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну не люблю я xms < xmx
Я так настроил чтобы видеть потребление памяти в процесс-листе, но в этот раз как-то не получилось.
Собстна есть другая аналогично нагруженная софтина не большая, и у нее при xmx=2g память не поднимается выше 600 мб. А тут вот уперлось в потолок.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705567
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как работает GC еще только разбираюсь, можно сказать вообще это первый опыт. Раньше он работал "ожидаемо" и я не заморачивался.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettКак работает GC еще только разбираюсь, можно сказать вообще это первый опыт. Раньше он работал "ожидаемо" и я не заморачивался.
Когда я начинал изучать java 1.4 то у меня были теже вопросы что и у тебя.

Хотел прикрутить на таймер вызов System.Gc.

Но вообще. Главная задача какая. Обеспечить 100% непрерывный flow Threads. А вызов GC их ставит на паузу. Потому как в науке и технике пока ещё неизвестно как можно двигать структуры данных в памяти и при этом не сломать Thread с алгоритмом который их юзает.

Сенсации с новыми Gc которые без пауз я бы поставил под сомнение.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705682
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton....Сенсации с новыми Gc которые без пауз я бы поставил под сомнение.
инкрементный GC минимум с 1.6

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

Если работает - ничего не трогай )))
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705714
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Потому как в науке и технике пока ещё неизвестно как можно двигать структуры данных в памяти и при этом не сломать

Ну вот здесь описано, как это делает Shenandoah: https://shipilev.net/talks/jpoint-April2017-shenandoah.pdf
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705715
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705722
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705724
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchmaytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
Погуглил - не может. Если фрагментированного свободного места не хватает, CMS выполняет fallback на serial GC.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705767
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВисит груша нельзя кушать."Тут всё написано" - из анекдота про техподдержку.
Есть целый ролик, где Шипилёв простым и понятным языком объясняет, как делать сборку мусора, не останавливая исполнения и сколько это стОит.
И даёт пример уборки полутора терабайт мусора за ~четыре секунды. Из которых блокирующих - ещё меньше.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705779
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИ даёт пример уборки полутора терабайт мусора за ~четыре секунды. Из которых блокирующих - ещё меньше.
на самом деле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  -Xmx4T -Xms4T, 1T живых данных

Shenandoah:
  Pause  Init Mark 28.901ms
  Concurrent  marking 1942G->2069120M(4194G) 3844.822ms
  Pause  Final Mark 2069G->1639G(4194G) 136.814ms
  Concurrent  evacuation 1639G->1837G(4194G) 6961.820ms
  Concurrent  reset bitmaps 973.670ms

G1:
  Pause  Young (G1 Evac Pause) 2813G->2790G(4194G) 26890.949ms
  Pause  Mixed (G1 Evac Pause) 2974G->2697G(4194G) 31789.592ms
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39705789
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchmaytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
Да так. Мысли вслух.

А в эпсилоне есть свой смысл.
...
Рейтинг: 0 / 0
Вопрос по расходу памяти
    #39712953
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основная проблема была в том, что я билдил jersery client`ы не правильно. Нужно было пул подключить и использовать один клиент, а не создавать каждый раз новый.
Теперь память выглдяит так:
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по расходу памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]