Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по расходу памяти / 25 сообщений из 26, страница 1 из 2
19.09.2018, 16:56
    #39705127
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Есть специфичное приложение на яве, если в кратце - это http прокси.
Запущен с параметрами xms=2g, xmx=8g
Почему черзе некоторое время работы хип раздувается до этих 8 гигов? Почему gc раньше мусор не подчищает?
...
Рейтинг: 0 / 0
19.09.2018, 16:58
    #39705131
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
У программы есть кэш свой, и не очень понятно из вне, сколько реально программе нужно памяти чтобы удерживать необходимый размер кэша.
...
Рейтинг: 0 / 0
19.09.2018, 19:28
    #39705214
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Или это мемори лик?
...
Рейтинг: 0 / 0
19.09.2018, 19:30
    #39705215
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
А зачем ему подчищать? Ты разрешил пухнуть до 8 . Вот. Пухнет.
...
Рейтинг: 0 / 0
19.09.2018, 20:17
    #39705227
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Был раньше кэширующий прокси на Яве, но вел себя хорошо по ресурсам (наверное руками писали)

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

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

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

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

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

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

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

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

Почему "ручной" вызов gc подчищает больше мусора?
Зачем jvm держит лишний мусор, а не удаляет его сразу, как делает это при "ручном" вызове сборщика?
...
Рейтинг: 0 / 0
20.09.2018, 11:35
    #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
20.09.2018, 11:42
    #39705526
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Я про возврат ресурсов и не говорю (хотя судя по графику и такое бывает).
Вот он работал работал, и раздул хип. Ну в общем-то если подумать о фрагментации памяти, то вроде все становится ясно. Ему просто не хочется лишний раз делать дефрагментацию наверное.

Я побольше поэкспериментировал, "ручной" вызов освобождает память, но если его вызывать повторно, то он еще освободит, и еще, в итоге из 1.5 гигабайт используемой памяти остается 40 мегабайт.
...
Рейтинг: 0 / 0
20.09.2018, 11:43
    #39705528
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
авторВыделить память сколько требуется всем службам и зафиксировать xms==xmx, в оптимале и своп даже можно выключить (но AFAIK лучше оставить, на случай чрезвычайных ситуаций, а то иногда даже и к консоле не подконектится)
На самом деле меня интересовал вопрос, не вывалится ли софт в OME, пока я буду спать. В общем-то научился пользоваться visual jvm, теперь я спокоен.
...
Рейтинг: 0 / 0
20.09.2018, 12:09
    #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
20.09.2018, 12:21
    #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
20.09.2018, 12:38
    #39705566
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
авторну не люблю я xms < xmx
Я так настроил чтобы видеть потребление памяти в процесс-листе, но в этот раз как-то не получилось.
Собстна есть другая аналогично нагруженная софтина не большая, и у нее при xmx=2g память не поднимается выше 600 мб. А тут вот уперлось в потолок.
...
Рейтинг: 0 / 0
20.09.2018, 12:39
    #39705567
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Как работает GC еще только разбираюсь, можно сказать вообще это первый опыт. Раньше он работал "ожидаемо" и я не заморачивался.
...
Рейтинг: 0 / 0
20.09.2018, 15:01
    #39705658
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
HettКак работает GC еще только разбираюсь, можно сказать вообще это первый опыт. Раньше он работал "ожидаемо" и я не заморачивался.
Когда я начинал изучать java 1.4 то у меня были теже вопросы что и у тебя.

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

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

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

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

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

Ну вот здесь описано, как это делает Shenandoah: https://shipilev.net/talks/jpoint-April2017-shenandoah.pdf
...
Рейтинг: 0 / 0
20.09.2018, 16:20
    #39705715
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
Типа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
...
Рейтинг: 0 / 0
20.09.2018, 16:26
    #39705722
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
maytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
...
Рейтинг: 0 / 0
20.09.2018, 16:29
    #39705724
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
LelouchmaytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
Погуглил - не может. Если фрагментированного свободного места не хватает, CMS выполняет fallback на serial GC.
...
Рейтинг: 0 / 0
20.09.2018, 17:45
    #39705767
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
maytonВисит груша нельзя кушать."Тут всё написано" - из анекдота про техподдержку.
Есть целый ролик, где Шипилёв простым и понятным языком объясняет, как делать сборку мусора, не останавливая исполнения и сколько это стОит.
И даёт пример уборки полутора терабайт мусора за ~четыре секунды. Из которых блокирующих - ещё меньше.
...
Рейтинг: 0 / 0
20.09.2018, 18:06
    #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
20.09.2018, 18:51
    #39705789
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по расходу памяти
LelouchmaytonТипа - засрал память мелкими объектами. Проредил. Удалил нечётные. Захотел аллоцировать один большой - и получил отлуп. И вроде память есть. Счётчик говорит. А нельзя. Висит груша нельзя кушать.
Это к чему? Если я правильно понимаю поведение GC, такая ситуация может быть только у CMS
Да так. Мысли вслух.

А в эпсилоне есть свой смысл.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по расходу памяти / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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