|
Stream и память
|
|||
---|---|---|---|
#18+
Может кто то подсказать такой вопрос Код: java 1. 2. 3. 4. 5. 6. 7.
например есть такой метод- что он делает - идет в кеш за мапой - берет коллекцию ключей-по этим ключам в кеше находит нужные объекты ,фильтрует и считает вопрос простой на этапе вот этом Код: java 1.
мы получаем из кэша объекты - будут ли они все в памяти болтаться или же нет? и если же будут целиком объекты то если мы возьмем их id только например вот так Код: java 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 19:12 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, Вопрос переформулируй по взрослому. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:00 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp adminDontSleep, Вопрос переформулируй по взрослому. что именно тебе не понятно в вопросе? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:03 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, А) слово "болтаться" Б) нет второго вопроса. )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:09 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, Ну загрузились в память объекты. После использования сборщик все собрал. Тебе то что? Учитывая "преждевременная оптимизация зло!" можно спросить про твой термин "болтаться")))) Ну а визуально первый кусок кода лучше и понятнее. Тогда занафига ты портишь код? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:16 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp adminDontSleep, А) слово "болтаться" Б) нет второго вопроса. )))) смотри стрим начинается с получения из мапы кей сета - мы получаем множество UUID по этим UUID мы достаем из кеша Объекты далее мы преобразуем стрим из этих объектов в стрим идентификаторов и далее фильтруем по неким условиям и считаем сумму элеметов в стриме ворпос в том будут ли в памяти все время работы этого метода все Объекты которые мы выбрали из кеша? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:22 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp adminDontSleep, Ну загрузились в память объекты. После использования сборщик все собрал. Тебе то что? Учитывая "преждевременная оптимизация зло!" можно спросить про твой термин "болтаться")))) Ну а визуально первый кусок кода лучше и понятнее. Тогда занафига ты портишь код? проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый поэтому и возник вопрос - если все время работы метода все объекты будут в хипе - то такое мне не подходит ,если же элемент после второго map будет кандидат на удаление - то это уже более интересно .Но я подозреваю что пока метод целиком не отработает на все этим элементы будут ссылки из стрима и хип раздуется ровно на количество этих элеентов - что мне конечно же не подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:27 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, Тебе не сложно счас сгенерить стрим на 10млн? Ты прошлый раз 5 страниц экономил память, а тормозила субд. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, чего ты на парня набросился. Он вполне себе хороший вопрос задает. И своевременный. Беспокоиться о ресурсах. Я вижу 2 варианта. Первое - найти в API описание того как работает стрим-процессинг. И второе - мемори профайлер. И смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:34 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Вот по 17-шке пишут. https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html The key abstraction introduced in this package is stream. The classes Stream, IntStream, LongStream, and DoubleStream are streams over objects and the primitive int, long, and double types. Streams differ from collections in several ways: No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations. Functional in nature. An operation on a stream produces a result, but does not modify its source. For example, filtering a Stream obtained from a collection produces a new Stream without the filtered elements, rather than removing elements from the source collection. Laziness-seeking. Many stream operations, such as filtering, mapping, or duplicate removal, can be implemented lazily, exposing opportunities for optimization. For example, "find the first String with three consecutive vowels" need not examine all the input strings. Stream operations are divided into intermediate (Stream-producing) operations and terminal (value- or side-effect-producing) operations. Intermediate operations are always lazy. Possibly unbounded. While collections have a finite size, streams need not. Short-circuiting operations such as limit(n) or findFirst() can allow computations on infinite streams to complete in finite time. Consumable. The elements of a stream are only visited once during the life of a stream. Like an Iterator, a new stream must be generated to revisit the same elements of the source. Но я-бы использвал не keySet а .entrySet(). Вот какое-то у меня есть предчувствие что лучше брать тот итератор который уже дан без лишних преобразований. Код: java 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:41 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton, Совсем нет. Ты силен в алгоритмизации. Я в архитектуре. Почему у нас должны быть одинаковые вопросы. Я ставлю оценку за технику а ты за артистизм)))) Ты правда думаешь что надо переписать код? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Ты чего градус повышаешь? Обсуждай код а не людей. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:34 |
|
Stream и память
|
|||
---|---|---|---|
#18+
[quot mayton#22420011]Вот по 17-шке пишут. https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html The key abstraction introduced in this package is stream. The classes Stream, IntStream, LongStream, and DoubleStream are streams over objects and the primitive int, long, and double types. Streams differ from collections in several ways: No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations. Functional in nature. An operation on a stream produces a result, but does not modify its source. For example, filtering a Stream obtained from a collection produces a new Stream without the filtered elements, rather than removing elements from the source collection. Laziness-seeking. Many stream operations, such as filtering, mapping, or duplicate removal, can be implemented lazily, exposing opportunities for optimization. For example, "find the first String with three consecutive vowels" need not examine all the input strings. Stream operations are divided into intermediate (Stream-producing) operations and terminal (value- or side-effect-producing) operations. Intermediate operations are always lazy. Possibly unbounded. While collections have a finite size, streams need not. Short-circuiting operations such as limit(n) or findFirst() can allow computations on infinite streams to complete in finite time. Consumable. The elements of a stream are only visited once during the life of a stream. Like an Iterator, a new stream must be generated to revisit the same elements of the source. все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет? тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление проверять я конечно проверю- но может быть кто то знает и сталкивался с этим ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:25 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Ты чего градус повышаешь? Обсуждай код а не людей. Пусть ТС сделает тест что кончилась память. Это же разумно? Тебе некуда же бежать и спешить? Верно? Я именно это просил ТС. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:49 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep мой вопрос простой "ТС работает больше отвечающих" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:50 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет? тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление проверять я конечно проверю- но может быть кто то знает и сталкивался с этим В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap. Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно об этом не попросишь в методе Collect например. P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 23:08 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton, +1 Про кеш верно. Если это кеш1 то мы рожаем объект из бд в оперативке из бд, Если это кеш2 то мы пробегаем по объектам. Если... Гадание гадалок а не программистов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 23:24 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton adminDontSleep все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет? тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление проверять я конечно проверю- но может быть кто то знает и сталкивался с этим В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap. Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно об этом не попросишь в методе Collect например. P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного? кеш в данном случае это хезель каст ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 09:44 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep хезель mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе. Тяжело выбросить в лог замер по памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 09:51 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Как то, смотрим свой код но абсолютно ничего не делаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 09:52 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep mayton пропущено... В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap. Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно об этом не попросишь в методе Collect например. P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного? кеш в данном случае это хезель каст А Hazelcast в данном случае является главным источником данных? Или он просто является слоем перед DBMS? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 10:51 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp adminDontSleep хезель mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе. Тяжело выбросить в лог замер по памяти? конечно тяжело-это же динамический процесс - его нужно отловить- тоесть когда система будет нагружена достаточно если делать замеры на тестовой среде - нужно просить тестировщиков - а это геморой- проше на форуме спрсоить - может кто то знает как оно там работает под капотом но фактически уже сейчс понятно что коллекция объектов будет загружена в хип из кэша ,далее пока не применится терминальная операция стрим не понменят своего состояния - тоесть фактически я думаю что пока метод не отрбаотает на все эти объкеты будет ссылка и гц не сможет их удалить до оконочания метода- это собственно все ,что мне нужно знать было если есть кто не согласен с этим - прошу к дискуссии ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 10:52 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый Есть "объект" и "данные объекта". "Объект" это "указатель на данные объекта и сами данные" (они могут храниться раздельно) или "указатель на (другой) объект". Если объект это какой-нибудь Long, то указатель на данные объекта будет больше, чем сами данные. Если объект это какой-нибудь байтовый буфер на пару килобайт, то указатель на данные объекта - пренебрежимо мал. Так вот - данные объекта не копируются, если вы специально этим не озаботились. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 10:52 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton adminDontSleep пропущено... кеш в данном случае это хезель каст А Hazelcast в данном случае является главным источником данных? Или он просто является слоем перед DBMS? в данном случае хезель является источником правды и можно тоже самое сделать средствами хезелькаста и на стороне хезелькаста не затаскивая в хип лишние данные. Но я повторюсь - меня интересует как будет огранизована работа памяти в данной цепочке колекция UUID -по ней получаем из кэша- стрим объектов - мапим в стрим других объектов( например в лонги) фильтруем и считаем количество элементов вот на каждом этом этапе интересует поведение памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 10:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый Есть "объект" и "данные объекта". "Объект" это "указатель на данные объекта и сами данные" (они могут храниться раздельно) или "указатель на (другой) объект". Если объект это какой-нибудь Long, то указатель на данные объекта будет больше, чем сами данные. Если объект это какой-нибудь байтовый буфер на пару килобайт, то указатель на данные объекта - пренебрежимо мал. Так вот - данные объекта не копируются, если вы специально этим не озаботились. в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:01 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep колекция UUID -по ней получаем из кэша- стрим объектов - мапим в стрим других объектов( например в лонги) фильтруем и считаем количество элементов вот на каждом этом этапе интересует поведение памяти Дьявол в деталях. Я - не специалист в Хазел. Я даже его не использовал. Но я использовал Apache Ignite. Это такой себе брат-близнец по функционалу. И вот учет памяти в Ignite осложняется тем что объекты не лежат в heap. Они лежат в оперативке но не в JavaHeap. Это одна деталь. Надо узнать как Хазел хранит ключи и значения. Возможно он тоже как-то оптимизирует техники хранения. Это нужно поскольку во всех in-memory кешах делают защиту от лишней активности GC кидая их нативную память. И еще одна деталь. Начиная с Java 14 появился новй API (кажется foreign memory) который чего-то там улучшает для offheap. Проверь какая Java. На что влияет? Ну как всегда на удобства использования. И надо проверить как это использует Hazel. Что еще посмотреть? Посмотри JMX-компоненты которые мониторят память в Hazel. Желательно их дампить в текстовый файл каждые 3-5 секунд и отображать в Graphana. Это важно во время твоего тестирования ключей. Тоесть такой юзкейс который ты придумал как учёт количества ключей - вытекает в такой сложный investigation. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:27 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep я думаю они будут целиком загружены в хип Если загружены то память не изменится. Если не загружены то памятью заведует ПО а не сборщик мусора. И т.д. и т.п. Без проверки твои догадки ноль. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
У хазел настройка по умолчснию хранить в памяти 1000 обьектов. Остыльные в хранилище. Тут мы тыкаем палочкой в слона и даже не видим ответ. Так как ТС не у компа и не у кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:38 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны. Ну или читатйте доки этого самого Hazelcast-а. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:41 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Начиная с Java 14 появился новй API (кажется foreign memory) который чего-то там улучшает для offheap. В Java14 появился JEP 352: Non-Volatile Mapped Byte Buffers для NIO и с ограничениями на поддерживаемые системы. А JEP 393: Foreign-Memory Access API (Third Incubator) продолжал оставаться инкубаторе на Java16. И в Java17 он тоже остаётся в инкубаторе как часть JEP 412: Foreign Function & Memory API (Incubator) . ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:49 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны. Ну или читатйте доки этого самого Hazelcast-а. хезель каст в данном случае работает как отдельный процесс в докер контейнере ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep Basil A. Sidorov пропущено... "Смешались в кучу кони, люди ..." Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны. Ну или читатйте доки этого самого Hazelcast-а. хезель каст в данном случае работает как отдельный процесс в докер контейнере ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 12:04 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep хезель каст в данном случае работает как отдельный процесс в докер контейнере 1. Процессы изолированы и бессмысленно рассуждать откуда именно ваш процесс берёт объекты: они у него точно есть (вместе со всеми их данным) и они (все) - в куче. 2. "Оптимизация" использования памяти вашим процессом - оно точно надо??? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 13:10 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, Он боится что выскочит райзе - Память кончилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 13:14 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, не надо домысливать за человека. Я, например, домысливаю, что он занимает преждевременной оптимизацией, но, всё-таки, не пытаюсь озвучивать свои домыслы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 14:57 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Я думаю тема топика - оптимизация памяти. Но мне кажется что она не про Java а про Хазелкаст. Надо читать его мануалы и учебники. Если выборка всех ключей из Hazelcast - это антипаттерн, тогда про это должно быть упоминание. Убежден что эта тема проскакивала в Quora, Stackover e.t.c. По поводу стримов. Я очень сильно рекомендую автору переписать этот блок на обычный цикл for. Код: java 1. 2. 3. 4. 5.
Это займет 5 минут. Всяко быстрее чем еще много страниц обсуждать несуществующие технические долги. И тогда все вопросы по Java стримам отпадут и останутся только чистые вопросы эксплуатации Хазелкаст. Будем рубить ненужные хвосты. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 15:11 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov PetroNotC Sharp, не надо домысливать за человека. Я, например, домысливаю, что он занимает преждевременной оптимизацией, но, всё-таки, не пытаюсь озвучивать свои домыслы. Преждевременная оптимизация для чего? Ответ - для того чтобы не было райзе по памяти. Или вы не память оптимизируете? Очевидность а не домыслы))) LOL ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 15:34 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton, Ничего он не поправит, не залогирует и не проверит. Он выше сказал. А значит топик тихо умрет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 15:36 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, придержи коней Если используется правильный LRU то чтение кеша вызовет только рециркуляцию сущностей но не вызовет обязательно OutOfMemory. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 15:50 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton PetroNotC Sharp, придержи коней Если используется правильный LRU то чтение кеша вызовет только рециркуляцию сущностей но не вызовет обязательно OutOfMemory. Попробуй сам скажи для чего автор ОПТИМИЗИРУЕТ. Цель то какая? Слава богу в термине Оптимизация у нас консенсус ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:00 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается. Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями. Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:10 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Вот выборка ключей по предикату https://docs.hazelcast.com/hazelcast/5.0/query/querying-maps-predicates Наподобие SELECT .. WHERE в базах данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:20 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается. Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями. Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог. все верно есть задача - а я выбираю как лучше сделать,объекты находятся в кеше( хезель каст) - нужно взять все имеющиеся там объекты взять у них атрибут по нему отфильтровать и посчить сумму объектов чтобы это сделать можно пойти несколькими путями 1.достать из кеша все эти объекты и сделать то о чем я писал в начале топика- но меня смушает тот факт что я буду тянуть в хип по сути не нужные мне объекты чтобы их просто посчитать 2.можно сделать это средствами хезель каста - тоже не выглядит как суперпроизводительное решение да все верно это преждевременная оптимизация- но и собственно интерес к тому,как это будет выглять в памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:33 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Вот чудак. Делай средствами Хазелькаста. Или ты думаешь что ты умнее и хитрее его создателей? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:44 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается. Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями. Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог. Ему решать) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 16:53 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Вот чудак. Делай средствами Хазелькаста. Или ты думаешь что ты умнее и хитрее его создателей? хорошо вот средствами хезелькаста Код: java 1. 2. 3. 4. 5.
я правильно понимаю что вот эта строчка Код: java 1.
все таки вытащит в хип джава процесса эту коллекцию - пусть и уже отфильтрованную ,либо же в хип попадет только size() ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 17:01 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Как бы простыми словами... Вот у тебя в базе лежит 10 000 результатов опросов (survey) к примеру. Из них по ключу ты выберешь допустим 5%. Почему 5? Я не знаю. Я просто так решил. Можешь взять 20% неважно. Но я думаю что Хазел умеет срезать углы на поворотах и для подсчета штук сделат ровно тот объем вычислений что надо. Но не будет процессить 100% сущностей. Вот я так рассуждаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 17:11 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Как бы простыми словами... Вот у тебя в базе лежит 10 000 результатов опросов (survey) к примеру. Из них по ключу ты выберешь допустим 5%. Почему 5? Я не знаю. Я просто так решил. Можешь взять 20% неважно. Но я думаю что Хазел умеет срезать углы на поворотах и для подсчета штук сделат ровно тот объем вычислений что надо. Но не будет процессить 100% сущностей. Вот я так рассуждаю. ну я с тобой тут согласен - но мы все таки явно не выяснили как под капотом ведет себя стрим- может ( конечно нет,но всеже) тут ворпос тоже ребром - кеш так же будет процессиить эту мапу,и так же тратить ресурсы свои на это и тут вопрос где будет оптимальней так же мы в случае с хезель часть работы возложим на кеш часть вытащим в джава процесс - тоесть не все так однозначно как ты говоришь ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 17:17 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Померяй время отклика в двух случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 17:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Померяй время отклика в двух случаях. Без работы руками никак ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 17:38 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton Померяй время отклика в двух случаях. Без работы руками никак Он - странный. Я дал ссылку на доку - он говорит мы не выяснили как работает Stream. Мне кажется что в будущих топиках надо взять за правило вообще ставить в игнор все сомнения новичков. Пускай обосновывают свои сомнения фактами. А то получается мы тут как ... психологи. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 21:48 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton, Какой новичок? Это же стас))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 23:04 |
|
Stream и память
|
|||
---|---|---|---|
#18+
В данном случае для подсчета оптимально использовать https://docs.hazelcast.org/docs/4.0/javadoc/com/hazelcast/map/IMap.html#aggregate-com.hazelcast.aggregation.Aggregator-com.hazelcast.query.Predicate- и в heap точно объекты не потянет, и скорость работы в десятки/сотни раз быстрее будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 12:33 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Как я помню, цепочка стримов без терминальной операции всего лишь "план действия" Код: java 1. 2. 3. 4. 5.
Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца. Если у нас цепочка состоит из методов на подобие Код: java 1.
то никаких новых обектов в памяти не появиться (по идее). Помять может начать расти, если: 1) В конце мы все собираем в коллекцию (собственно на размер коллекции). 2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать). 3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки. P.s. Выше написанное не утверждение, а тема для обсуждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:13 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7.
1) метод count() запускает цепочку. 2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект. 3) проверяется условие фильтра, если созданный объект проходит его, то .. 4) метод count() увеличивает счетчик на единицу. 5) созданный объект доступен для GC. 6) повторяются дейстия 2-5 для всех оставшихся элементов стрима. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:30 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, п. 2 может не создавать а взять ранее созданный ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Как я помню, цепочка стримов без терминальной операции всего лишь "план действия" Код: java 1. 2. 3. 4. 5.
Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца. Если у нас цепочка состоит из методов на подобие Код: java 1.
то никаких новых обектов в памяти не появиться (по идее). Помять может начать расти, если: 1) В конце мы все собираем в коллекцию (собственно на размер коллекции). 2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать). 3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки. P.s. Выше написанное не утверждение, а тема для обсуждения. 4) зависит от кучи настроек ПО по кешированию которое перебирает стрим. Это покрывает все п.п. c 1 по 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:43 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, Представь что он перебирает стримом фотографии fullhd 4k ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:45 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp 4) зависит от кучи настроек ПО по кешированию которое перебирает стрим. Это покрывает все п.п. c 1 по 3 Скорее всего... Я стримы поверхностно знаю. Поэтому и написал, чтоб не рассматривали как утверждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:59 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, Увы. Лучше обсуждать те темы, где чел находится возле компа. Тут этого нет. Гадать можно что угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 16:19 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Код: java 1. 2. 3. 4. 5. 6. 7.
1) метод count() запускает цепочку. 2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект. 3) проверяется условие фильтра, если созданный объект проходит его, то .. 4) метод count() увеличивает счетчик на единицу. 5) созданный объект доступен для GC. 6) повторяются дейстия 2-5 для всех оставшихся элементов стрима. примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 21:43 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Есть такие шаблоны как Vizitor, Iterator. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 21:51 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом. Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 22:56 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц Вверху уже писали, что стрим это что то вроде цикла. Т.е. твой код Код: java 1. 2. 3. 4. 5. 6. 7.
условно можно представить так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной, и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные. Стрим то работает со множеством, но делает это с каждым элементом этого множества по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 23:13 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Я это и предлагал в начале топика. Но здесь - смешались кони и люди. Автор поразительным образом сделал "замес" из технологий Hazelcast и Java-технологий и сам себя запутал. Вот надо разделять мух и котлет на будущее. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 23:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом. Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор. вот видишь - ты слабо себе представляешь работу стрима и путаешь его с другими стримами- у них вообще нет ничего общего в операции проежуточные они применяются не к элементам а с стриму ,они модифицируют стрим!!! а не элемент некторые тут вообще путают стрим с цилклом - они похожи только по каким то субъективным понятиям - фатически между ними ничего общего стрим вообще работает по принципу пул итераций так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 01:18 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной, и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные. Стрим то работает со множеством, но делает это с каждым элементом этого множества по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д. по выходу из метода понятно что все ссылки будут занулены - ибо это как ты верно сказал локальные переменные у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно базиль утрвеждает что стрим будет обрабатывать поэлементно эти объеты и забывать про них- но это скорей всего не так ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 01:21 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, посмотри код выше , где представлен альтерантивный вариант метода через цикл for. Так примерно работает стрим внутри. Т.е. переменная object обновляется каждую итерацию цикла, ссылка на старый объект теряется. А Basil A. Sidorov толковые вещи пишет, перечитай его последний пост. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:01 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Посмотри еще доки официальные, там есть, например, вот это: reduce Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:08 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Т.е. по факту реализация метода reduce - это цикл. Теперь возми вот этот код: Код: java 1. 2. 3. 4.
и выполни его для 1000 элементов. Сколько у тебя в этом случае создасться объектов в памяти, на которые будет удерживаться ссылка? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:26 |
|
Stream и память
|
|||
---|---|---|---|
#18+
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, 02:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
В первом примере все элементы бесконечного стрима "пролетают насквозь" нашу цепочку методов стрима. Создается бесконечное количество строк "0", но они каждую итерацию присваиваются одной и той же переменной. Во втором случае создается бесконечное количество строк "0", которые накапливаются в методе sorted() и не проходят дальше (накапливаются в памяти). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 03:12 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep вот видишь - ты слабо себе представляешь работу стрима Допустим, что это факт, а не ваша вольная интерпретация. Как из этого факта следует, что объект-поток удерживает от сборки мусора те элементы, которые он "потрогал"? P.S. Я в курсе, что конкретные промежуточные операции (например - сортировка) будут "удерживать" весь сортируемый набор, но другим промежуточным операциям (например - счётчик) это совсем не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 03:31 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно покажиПамять() до и после вызова метода. Разве не очевидно? Код: java 1. 2. 3. 4. 5. 6. 7.
А как память внутри метода зачем тебе? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 10:44 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep это очень важно простейшая логика и здравый смысл говорят обратное. Без профилирования в целом метода нельзя копаться внутри метода. Если конечно твоя цель не просто поболтать бесцельно. С другой стороны, бросив три фразы выше кто их обосновывать будет? 22421401 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 12:52 |
|
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 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep ну и да я пытаюсь везде экономить и бороться за максимальную производительность у меня например instaceOf ревью не пройдет Тут пишут, что особых проблем с instanceOf нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 01:02 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep теперь ты гораздо ближе к истине ,но count() это терминальная операция P.S. Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 09:50 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное? Как сказал бы препод ВУЗа: "в чем предмет спора?" ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 14:03 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton adminDontSleep гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно Расскажи как ты себе понимаешь "утечку памяти". утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 18:17 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen adminDontSleep ну и да я пытаюсь везде экономить и бороться за максимальную производительность у меня например instaceOf ревью не пройдет Тут пишут, что особых проблем с instanceOf нет. давно ли стак стал истиной в последней инстанции? запомни если у тебя в ООП модели где то закрался instanceOf ты уже проиграл эту битву- почему - попытайся понять сам ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 18:23 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep теперь ты гораздо ближе к истине ,но count() это терминальная операция P.S. Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи. я тебе привел один и тот же стрим с разными терминалками и ты все равно как упертый продолжаешь твердить одно и тоже- очвеидно что count() вызывает распухание в два раза большее ,чем поэлементная терминалка- о чем это говорит додумай сам но ладно я тебе помогу - я уменьшил хип немного ,запустил в два потока и на count() словил OOM теже вводные но мерминалка forEach () - OOM не произошло дальше будешь спорить? тоесть очевидно что ты явно не понимаешь как работают терминалки и стримы ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 18:51 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan adminDontSleep да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут К сожалению я прочитал эти посты, и повторю еще раз - и графики и выводы полная фигня. Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное? У тебя графики за разные интервалы времени, не выставлен xmx, внутри forEach стоит System.out::println - хотя бы из-за этого твои картинки не имеют никакого смысла. После того как ты это исправишь, еще можешь рассказать как эти графики объясняют что-то про буферизацию/утечки/по элементные обработки - вот это будет самое интересное и смешное хорошая попытка ,но нет,ты проиграл даже не попытавшись) для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции поведение памяти ИНОЕ! там явно нет поэлеменнтых операций ,как утверждает фауст и базиль- там идет pull iteration и это явно прослеживается на графиках собственно можно очень просто проверить - уменьшить хип и посмотреть будет ли OOM,если обработка стрима будет поэлементая - то мы никогда не получим ООМ,и мы таки получим ООМ если гц по не сможет убирать объекты собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 19:02 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep теперь ты гораздо ближе к истине ,но count() это терминальная операция P.S. Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи. а что ты скажешь на ООМ?)) где то неувязка в твоей теории... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 19:03 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep хорошая попытка ,но нет,ты проиграл даже не попытавшись) для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции поведение памяти ИНОЕ! Ты говоришь абстрактное ИНОЕ потому что не можешь сказать что-то конкретное без общих фраз или что? adminDontSleep собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц) Ради тебя взял твой пример, на который ты ссылаешься: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Работает спокойно на -Xmx10M и никаких ООМ. Так что можешь не врать или показать свой пример запуска ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 19:13 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan adminDontSleep хорошая попытка ,но нет,ты проиграл даже не попытавшись) для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции поведение памяти ИНОЕ! Ты говоришь абстрактное ИНОЕ потому что не можешь сказать что-то конкретное без общих фраз или что? adminDontSleep собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц) Ради тебя взял твой пример, на который ты ссылаешься: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Работает спокойно на -Xmx10M и никаких ООМ. Так что можешь не врать или показать свой пример запуска где доказательства работы?просто пук в небо тут не пройдет- видео с параметрами запуска пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 19:45 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, Все для тебя друг: https://drive.google.com/file/d/1KSX1EIaaY7Ta-OONk-K-yze5Pp5XBPiw/view?usp=sharing - только вначале скачай, а то онлайн не быстро воспроизводится. Ну и в ответ покажи свое видео, всегде мечтал увидеть чудо, а тут такой случай попался. Давай хотя бы чтобы на мегабайт 200 упало с ООМ ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 20:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan adminDontSleep, Все для тебя друг: https://drive.google.com/file/d/1KSX1EIaaY7Ta-OONk-K-yze5Pp5XBPiw/view?usp=sharing - только вначале скачай, а то онлайн не быстро воспроизводится. Ну и в ответ покажи свое видео, всегде мечтал увидеть чудо, а тут такой случай попался. Давай хотя бы чтобы на мегабайт 200 упало с ООМ сделал так же -OOM нет-причем я запускал это в 4х потоках тогда сорян- но у меня реально на тесте выскочил ООМ в прошлый раз причем xmx был 512 вроде может изза друих процессов на компе ( я смотрел видос на ютубе) не хватило для гц и он не успел очистить но признаю свою неправоту- видно что нет никаких проблем и гц все чистит- значит никакой буферизации у count() нет причем не возниакиет проблем если этот код пустить в 4+ потоках - картина не меняется ,за исключениемм активновсти ГЦ ну собвственно это я и хотел выяснить ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 20:59 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep mayton пропущено... Расскажи как ты себе понимаешь "утечку памяти". утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки Верно. И разве у тебя есть такая проблема? По моему - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 21:17 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton adminDontSleep пропущено... утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки Верно. И разве у тебя есть такая проблема? По моему - нет. ну я ее словил - надо вопроизвести как но фактичеки выставив 10 м хипа я вижу что все оюъекты создаваемые успешно удаляются меня изначально смутил тот факт что две разные теримнальные операции почему то в памяти выглядят по разному я для себя предположил что count() применяется как батч- тоесть не поэлеменнто а некими пачками - посему в хипе некоторое время удреживается часть объектов и это бы было проблемой - так как если будет условно много потоков - то хип ляжет по ООМ- но такого не произошло - на мое удивление и это говорит о том,что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 21:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep mayton пропущено... Верно. И разве у тебя есть такая проблема? По моему - нет. ну я ее словил - надо вопроизвести как но фактичеки выставив 10 м хипа я вижу что все оюъекты создаваемые успешно удаляются меня изначально смутил тот факт что две разные теримнальные операции почему то в памяти выглядят по разному я для себя предположил что count() применяется как батч- тоесть не поэлеменнто а некими пачками - посему в хипе некоторое время удреживается часть объектов и это бы было проблемой - так как если будет условно много потоков - то хип ляжет по ООМ- но такого не произошло - на мое удивление и это говорит о том,что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся. На графиках наблюдается обычная активность средное-статичтического java-приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 21:38 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep но признаю свою неправоту- видно что нет никаких проблем и гц все чистит Начинай с кода а не с говорильни и все будет ОК ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 21:41 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте Обычно расчет идет на уровне БД, чтобы не пересылать по сети миллионы строк в java приложение - и обычно профит идет из-за этого. Где идет инкремент это уже мелочи на фоне затрат на сетевое взаимодействие ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2022, 21:48 |
|
Stream и память
|
|||
---|---|---|---|
#18+
SpringMan adminDontSleep что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте Обычно расчет идет на уровне БД, чтобы не пересылать по сети миллионы строк в java приложение - и обычно профит идет из-за этого. Где идет инкремент это уже мелочи на фоне затрат на сетевое взаимодействие у нас в качестве бд пострегрс - и есть такой кейс где клиент очень плотно работает с данными - тоесть они где то в течении 10 -15 минут постоянно обновляются и выдаются клиенту- и бд ставноится бутылочным горлышком - и как нельзя лучше тут подошел хезель ,который процессит эту дату с временным гепом небольшим по истечении времени это все записывается в бд все это хорошо ложится на много нод,так как хезель все это поддерживает поэтому считать каунт в даннм конкретном случае мы из бд не можем - ибо в бд еще ничего не записано почему уточнил что постгрес- потому что таже монго этот кейс отрабатывает без каких либо проблем ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 01:37 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся. На графиках наблюдается обычная активность средное-статичтического java-приложения. я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 01:49 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep я словил Поэтому и 5 страниц топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 06:52 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep mayton Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся. На графиках наблюдается обычная активность средное-статичтического java-приложения. я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время Запускай приложение с ключами Код: java 1.
Воспроизводи ошибку снова. Прикладывай файл. Или если знаешь что делать - покажи какие там объекты по количеству штук и по памяти (deep size). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 11:05 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton adminDontSleep пропущено... я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время Запускай приложение с ключами Код: java 1.
Воспроизводи ошибку снова. Прикладывай файл. Или если знаешь что делать - покажи какие там объекты по количеству штук и по памяти (deep size). на выходных погоняю ,сейчас работы много- но там помоему было что то около 19 млн Employee и где то столько же Long ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 15:20 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep mayton Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся. На графиках наблюдается обычная активность средное-статичтического java-приложения. я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время Прям целый набор взаимоисключающих параграфов. Не хочется активности ГЦ тогда не тащи данные в JVM просто спроси сразу число в том месте где данные хранятся те. БД. Никакого логического обоснования необходимости буферизации нет для count (именно с точки зрения count функции а не подтягивания данных в стрим). Если прям хочется скэкономить не тащи объект целиком, а лишь маркер его присутствия в heap. boolean isCacheServeyIdExistsByIdentity(); Вернутый Boolean можно подсчитать и booleans и так закэшированы в jvm. Даже больше если stream is sized то ответ count вернут сразу без даже какого либо каунтинга В примере выше все портит .filter(x -> x.getSurveyId() == surveyId превщает в unknown size stream, а это тащит .map(this::getCachedByIdentity) в heap. (вообще getCachedByIdentity как то стремно выглядет ведь map функция подразумевается конвертер данных т.е. даные и так в памяти и мы просто с ними оперируем а тут выглядет так что поддтягиваются данные из кэша, что и side effect может иметь и еще и блокинг при этом в стриме получить) Если нет возможности считать там где лежат данные и если повезло с surveyId и значения за диапазон небольшой не выходят, то пробуй не тащить целиком объект в head а тащи только getCachedSurveryIdByIdenity()) и проставь -XX:AutoBoxCacheMax ну например до 100тыс (если эти значения за 100тыс не выходят). adminDontSleep я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ больше похоже подправление кода и постоянный перезапуск, и одна из кривых версий кода хранила ссылки и получили OOM или RAM не осталось на машинке свободной прям в этот раз. но эта версия тут же была исправлена и теперь не вспомнить какая из версий кидала OOM. OOM можно получить если бомбить память быстрее чем GC успевает освобождать ее. решается круткой edem для краковременных объектов чтобы не успевали как old помечаться объекты (у меня на 60мб не успевает чистить эдем и все в old попадает но тут объем маленький GC и так с лихвой успевает 60Мб проверять) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 16:00 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Парень. Ну и 256Мб Xmx - это конечно верх жлобства. Щас самые мелкие виртуалки продаются начиная от 512 Мб. Я не знаю что у тебя за задачи стоят но мне кажется надо эти цифры серъезно пересмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 16:01 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton Парень. Ну и 256Мб Xmx - это конечно верх жлобства. Щас самые мелкие виртуалки продаются начиная от 512 Мб. Я не знаю что у тебя за задачи стоят но мне кажется надо эти цифры серъезно пересмотреть. 256 для теста я делал,так у меня стоит старт 2 верх 4 на проде понятно что больше - но как бы чем менее требователен код к ресурсам,тем я лучше себя чувсвую ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:10 |
|
Stream и память
|
|||
---|---|---|---|
#18+
lleming больше похоже подправление кода и постоянный перезапуск, и одна из кривых версий кода хранила ссылки и получили OOM или RAM не осталось на машинке свободной прям в этот раз. но эта версия тут же была исправлена и теперь не вспомнить какая из версий кидала OOM. OOM можно получить если бомбить память быстрее чем GC успевает освобождать ее. решается круткой edem для краковременных объектов чтобы не успевали как old помечаться объекты (у меня на 60мб не успевает чистить эдем и все в old попадает но тут объем маленький GC и так с лихвой успевает 60Мб проверять) врядли,я не использую hot reload ,такчто сомнительно что новый джава процесс будет каким то образом конфликтовать с убитым процессом так же в тесте был простейший класс и 1 метод - тоесть финты со стороны JIT тоже не подходяд скорей всего что то пошло не так при снятии тред дампа,это же тоже не бесплатно ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:17 |
|
Stream и память
|
|||
---|---|---|---|
#18+
[quot lleming#22423238] Прям целый набор взаимоисключающих параграфов. Не хочется активности ГЦ тогда не тащи данные в JVM просто спроси сразу число в том месте где данные хранятся те. БД. /quot] не в бд,а в кеше Хезелькаст второе я ж не сказал что вот так буду делать - я просто эксперементировал,сейчас я чотко понимаю,что такой процесс не вызовет у нас проблем в части OOM ,но вызовет другую проблему- будет тратиться процессорное время на слишком частые проходы ГЦ- понятное дело что это не то что я хочу и таки работу этого метода лучше делегировать хезелю,благо у него есть достаточно продвинутый api ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:24 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep скорей всего что то пошло не так Нагрузочный тест при 256. Ошибка должна повторятся.. А счас нет ни ошибки ни дампа ни теста. Он тебе: "вот 10 причин" Ты ему: "вряд ли... скорее всего это 11-я" ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:39 |
|
Stream и память
|
|||
---|---|---|---|
#18+
И надо обязательно разделить вопросы Hazelcast от вопросов Java-Stream. При малейшем сомнении на тему того как работает stream - мы выбрасываем stream из кода и заменяем его на цикл. Цикл прозрачен. Это базовая алгоритмическая конструкция. И все подкапотные аллокации мы видим. По хазелькасту - использовать его методы в ПЕРВУЮ очередь. Тоесть все count, filtering, группировки и прочие операции хазель-алгебры мы делаем в запросе. Это технологично. Это правильно. И никто не скажет что велосипед. Точно также работают и с реляционными базами. Максимум процессинга на уровне БД. А вот делать копию выборки на клиента и что-то гонять в стримах - это велосипед. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
а как hazel запущен отдельно ? или builtin в каждую ноду ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 19:26 |
|
Stream и память
|
|||
---|---|---|---|
#18+
lleming, Правильный вопрос черт возьми. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 20:40 |
|
Stream и память
|
|||
---|---|---|---|
#18+
И, что характерно - ответ уже имеется: 22420286 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2022, 05:49 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120265]: |
0ms |
get settings: |
23ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
90ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
2311ms |
get tp. blocked users: |
2ms |
others: | 362ms |
total: | 2822ms |
0 / 0 |