|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen adminDontSleep так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком Вот тест: 1) Этот код будет работать бесконечно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
2) Этот код выдаст Exception in thread "main" java.lang.OutOfMemoryError: Java heap space: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
отличный пример мембер. ТС'у учится "меньше слов и больше кода" В общем случае стрим это конвейерные операции. Память выделяется для самой коллекции проходящей через стрим или ВООБЩЕ не выделяется при обработке из сети. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 13:53 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp ....или ВООБЩЕ не выделяется при обработке из сети. это как? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:28 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, а) - создание коллекции для стрима - выделяем память ДЛЯ КОЛЛЕКЦИИ - обработка стримом без выделения памяти б) - есть канал из сети = память не выделяется - обработка стримом без выделения памяти ? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, аналогия - SAX и DOM парсер XML ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:41 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp ... б) - есть канал из сети = память не выделяется ... Что же это за сеть такая (на IBM PC и их клонах), что не требует локальной копии обрабатываемого объекта? p.s. AFAIK конечно есть сетевые карты с такой возможностью (Infiniband или сильно продвинутые 10 G), но вот их поддержки Java'ой - я лично не помню ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:44 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, вы наверно говорите о частностях. Есть коллекция из млн объектов. А не объект один. Именно это автора пугает. Конечно один объект по приходу создается. Суть что миллион не надо. И вообще, стрим не для "не требует локальной копии обрабатываемого объекта" Он для потока информации. Например видео поток. Ключевое слово поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:50 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, многие пишут что for на 30 проц быстрее стрима. Так что вопрос в том что тут экономит автор)) Он не борется с задачей. А изучает стримы за наш счет) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 14:53 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp многие пишут что for на 30 проц быстрее стрима. "не верю" ( C ) то, что знаю (профилировал) я: 1. при правильном использовании с ListArray стрим совершенно аналогичен for 2. при НЕправильном использовании с ListArray (что очень легко) стрим значительно (раза в 3-4, а может и больше) медленнее for'а. При п.2., не срабатывает Jit оптимизация проверки выхода за пределы массива (при использовании с ListArray). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 16:49 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Там особый юзкейс был. Посмотрю позже. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 17:23 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Посмотри еще доки официальные, там есть, например, вот это: reduce Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
фауст ты путаешь англ пеервод еквивалетно не значит что реализация ( а стало быть и сайд эфекты на память ) будут одинаковые- хотя внешне выглядит одианоково копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 19:16 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov P.S. Я в курсе, что конкретные промежуточные операции (например - сортировка) будут "удерживать" весь сортируемый набор, но другим промежуточным операциям (например - счётчик) это совсем не требуется. теперь ты гораздо ближе к истине ,но count() это терминальная операция - она возвращает число а не стрим,как промежуточные - разберись с этим и станет более понянет мой вопрос изначальный ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 19:21 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Roman Osipov В данном случае для подсчета оптимально использовать https://docs.hazelcast.org/docs/4.0/javadoc/com/hazelcast/map/IMap.html#aggregate-com.hazelcast.aggregation.Aggregator-com.hazelcast.query.Predicate- и в heap точно объекты не потянет, и скорость работы в десятки/сотни раз быстрее будет. согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 19:24 |
|
Stream и память
|
|||
---|---|---|---|
#18+
вообщем провел тест Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно второй тест был с forEach() там ожидаемо стрим работал более похоже на цикл это forEach() ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 20:12 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen В первом примере все элементы бесконечного стрима "пролетают насквозь" нашу цепочку методов стрима. Создается бесконечное количество строк "0", но они каждую итерацию присваиваются одной и той же переменной. Во втором случае создается бесконечное количество строк "0", которые накапливаются в методе sorted() и не проходят дальше (накапливаются в памяти). в своих примерах ты по незнанию работы стримов либо лукавишь ,либо просто ошибаешься- вверху две картинки,которые разрушают твою теорию - о поэлементной обработке - она поэлемента если у тебя териманалка поэлемента - если терминалка подразумевают некую буферизацию - ты проиграл поэтому твои тесты и не корректны и не отражают реальной картины происходящего ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 20:16 |
|
Stream и память
|
|||
---|---|---|---|
#18+
класс Employee Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
тесты проводились на этом коде терминальная оперцая forEach Код: java 1. 2. 3. 4. 5. 6. 7.
терминальная операция count() Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 20:19 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Так что вопрос в том что тут экономит автор)) картинка выше - простейший объект с одним полем- 1 гиг хипа на count() а теперь представь таких потоков будут сотни- понятно что балнсер скинет куда надо - но вот нужно ли лишние ноды нам или проще в хезеле обработать- все думают что хезель это что там такое бесплатное- но нет - теже самые ноды ну и да я пытаюсь везде экономить и бороться за максимальную производительность у меня например instaceOf ревью не пройдет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 20:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, Без обид, но ты меряешь какую-то фигню и делаешь такие же выводы. На обоих графиках used heap size падает до нуля - это значит, что нет там никакой буферизации. Память растет до гига, потому что у тебя идет генерация кучи Employee, и очищаются они тогда, когда jvm посчитает, что ей нужно свободное место. Поставь -Xmx на 50 мб и никакого гига никто тратить не будет. В твоем первоначальном примере, есть или нет утечки зависят только от двух мест: 1) Какая имплементация у surveyResultIdentitiesPersistDelayedMap(), если тут стандартные джавовые HashMap/TreeMap и т.д., то никаких буферизаций не будет (о чем тебе толдычат уже 4ую страницу). Если что-то другое, то надо смотреть какой стрим они возвращают (опять же обычно библиотечный код пишут не совсем идиоты, и вряд ли они будут что-то буферизировать без надобности) 2) Что находится в this::getCachedByIdentity, если этот кэш в хипе, то само сабой он будет расти. Но к стримам это имеет весьма далекое отношение На чьей стороне лучше делать, это скорее вопрос к hezelcast-у, а не каким-то утечкам на стримах ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 21:14 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep Копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например Что такое обратные пул итерации? Сбрось ссылку, если есть под рукой. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 21:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep в своих примерах ты по незнанию работы стримов либо лукавишь ,либо просто ошибаешься- вверху две картинки,которые разрушают твою теорию - о поэлементной обработке - она поэлемента если у тебя териманалка поэлемента - если терминалка подразумевают некую буферизацию - ты проиграл поэтому твои тесты и не корректны и не отражают реальной картины происходящего Ну я про это и писал выше, да и не только я. Понятно, что если цепочка у тебя заканчивается сбором всего в коллекцию, то у тебя будет забиваться память, но это потому, что ты в памяти держишь коллекцию и добавляешь в нее элементы. Тоже самое и с методом sort и ему подобными, как я понимаю внитру у него создается какая то структура данных для хранения элементов для сортировки. Стримы они ж вроде как не имеют состояния - это просто методы, которые вызываются, но методы внутри себя могут создавать объекты на время своей работы. А размер этих объектов зависит от реализации самих методоы стрима, а также от реализации функций, которые мы в эти методы передаем. Еще раз напишу, я стримы глубоко не знаю, просто когда с ними возился, и сложилось такое виденье. Где то могу ошибаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 21:48 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan adminDontSleep, Без обид, но ты меряешь какую-то фигню и делаешь такие же выводы. На обоих графиках used heap size падает до нуля - это значит, что нет там никакой буферизации. Память растет до гига, потому что у тебя идет генерация кучи Employee, и очищаются они тогда, когда jvm посчитает, что ей нужно свободное место. Поставь -Xmx на 50 мб и никакого гига никто тратить не будет. В твоем первоначальном примере, есть или нет утечки зависят только от двух мест: 1) Какая имплементация у surveyResultIdentitiesPersistDelayedMap(), если тут стандартные джавовые HashMap/TreeMap и т.д., то никаких буферизаций не будет (о чем тебе толдычат уже 4ую страницу). Если что-то другое, то надо смотреть какой стрим они возвращают (опять же обычно библиотечный код пишут не совсем идиоты, и вряд ли они будут что-то буферизировать без надобности) 2) Что находится в this::getCachedByIdentity, если этот кэш в хипе, то само сабой он будет расти. Но к стримам это имеет весьма далекое отношение На чьей стороне лучше делать, это скорее вопрос к hezelcast-у, а не каким-то утечкам на стримах да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 21:55 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen adminDontSleep в своих примерах ты по незнанию работы стримов либо лукавишь ,либо просто ошибаешься- вверху две картинки,которые разрушают твою теорию - о поэлементной обработке - она поэлемента если у тебя териманалка поэлемента - если терминалка подразумевают некую буферизацию - ты проиграл поэтому твои тесты и не корректны и не отражают реальной картины происходящего Ну я про это и писал выше, да и не только я. Понятно, что если цепочка у тебя заканчивается сбором всего в коллекцию, то у тебя будет забиваться память, но это потому, что ты в памяти держишь коллекцию и добавляешь в нее элементы. Тоже самое и с методом sort и ему подобными, как я понимаю внитру у него создается какая то структура данных для хранения элементов для сортировки. Стримы они ж вроде как не имеют состояния - это просто методы, которые вызываются, но методы внутри себя могут создавать объекты на время своей работы. А размер этих объектов зависит от реализации самих методоы стрима, а также от реализации функций, которые мы в эти методы передаем. Еще раз напишу, я стримы глубоко не знаю, просто когда с ними возился, и сложилось такое виденье. Где то могу ошибаться. ты много где верно говоришь но ошибаешься в одном 0 стримы имеют состояние- тоесть применяя какую то промежуточную операцию ты меняешь состояние стрима ЦЕЛИКОМ!!! а не его элементы при этом после этого ты уже не можешь вызывать состояние стрима которое было до этой операции ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 21:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen adminDontSleep Копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например Что такое обратные пул итерации? Сбрось ссылку, если есть под рукой. это основы работы стрима стрим работает от термианльной операции в отличии от любых циклов тоесть работа стрима начинается с терминалки и именно поэтому у тебя не забился хип- ты применял терминалку к каждому элементу стрима - потоэтму гц спокойно собирал нулевые ссылки как я тебе выше показал даже count() показывает абсолютно другое состоняние памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 22:02 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут К сожалению я прочитал эти посты, и повторю еще раз - и графики и выводы полная фигня. Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное? У тебя графики за разные интервалы времени, не выставлен xmx, внутри forEach стоит System.out::println - хотя бы из-за этого твои картинки не имеют никакого смысла. После того как ты это исправишь, еще можешь рассказать как эти графики объясняют что-то про буферизацию/утечки/по элементные обработки - вот это будет самое интересное и смешное ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 22:36 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно Расскажи как ты себе понимаешь "утечку памяти". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 23:56 |
|
|
start [/forum/topic.php?fid=59&msg=40126965&tid=2120265]: |
0ms |
get settings: |
24ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
501ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 643ms |
0 / 0 |