|
java reflectoion
|
|||
---|---|---|---|
#18+
Привет. Кто-нибудь понимает, чего не хватает java вот в этом коде и как преодолеть этот нелегальный аргумент? https://onlinegdb.com/XgaL8lF1CH При том, что закомментированный блок кода вызывает тот же самый эксепшн. А вот рефлексивное обращение на двух предыдущих полях - нет. Что-то мне ничего в голову не приходит... Код: 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:21 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, int currentCapacity = ((Object[]) capacityField.get(l1)).length; ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:35 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
Андрей Панфилов, спасибо! Ну и вдогонку пара вопросов, из-за чего я все это затеял. 1. Похоже, у arrayList нет возможности обрезать capacity до произвольного значения (не до size)? 2. Вроде как в документации по Java написано, что классические массивы не рекомендуется использовать, а вместо них везде надо использовать аррэйлист. На практике так и делают? В реальных проектах действительно все построено на аррэйлистах и никто не использует массивы в чистом виде? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 13:10 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, Использовать списки и коллекции а не конкретно одно имя. Так же как вместо тупых указателей на память используют умные. Так же как вместо руками obj.free() используют сборщик мусора. И т.и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 14:18 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, Ну и reflection это антипаттерн)) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 14:27 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp f9n6001, Ну и reflection это антипаттерн)) У Вас есть альтернативное решение, как узнать реальный размер массива внутри arrayList'а? Вы сможете освободить память, сжав этот массив до разумного размера (не через .trimToSize() потому что после этого метода первая же вставка в аррэйлист пересоздаст массив и увеличит его размер в два раза)? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 14:54 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
Программерам вообще свойственно очень вольно относиться к аппаратным ресурсам, а админы потом голову чешут, как заставить работать то чудо, которые наваяли вышеуказанные разработчики. Билл Гейтс в свое время бил пяткой в грудь, что 640 kb базовой памяти хватит всем и всегда. Ага. Да. Конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 14:58 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 Андрей Панфилов, спасибо! Ну и вдогонку пара вопросов, из-за чего я все это затеял. 1. Похоже, у arrayList нет возможности обрезать capacity до произвольного значения (не до size)? Под arrayList поднимается java.util.ArrayList то через copy. Если скучно можно свое сделать переопределив f9n6001 2. Вроде как в документации по Java написано, что классические массивы не рекомендуется использовать, а вместо них везде надо использовать аррэйлист. На практике так и делают? В реальных проектах действительно все построено на аррэйлистах и никто не использует массивы в чистом виде? по обстоятельствам, в array можно ошибиться и сделать чтото не так либо попрортить. Там где много модификаций Arrays.systemCopy возможно будет бить по перфомансу. Вот всяких десиалайзерах(и не только) часто вместо чистого bytearray пользуются ByteReference или ByteBuffer ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:02 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, Ты изучи коллекции, списки. Потом поговорим. Это каждый джун должен знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:05 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
PetroNotC Sharp f9n6001, Ну и reflection это антипаттерн)) и нисколько ни антипаттерн. в первых числах было медленным, но счас даже очень быстрым сделали ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:06 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 PetroNotC Sharp, PetroNotC Sharp f9n6001, Ну и reflection это антипаттерн)) У Вас есть альтернативное решение, как узнать реальный размер массива внутри arrayList'а? переопредели ArrayList и добавь метод который вернет размер f9n6001 Вы сможете освободить память, сжав этот массив до разумного размера (не через .trimToSize() потому что после этого метода первая же вставка в аррэйлист пересоздаст массив и увеличит его размер в два раза)? а есть варианты этого не делать ? Если вопрос почему в два раз то это questionable. Тут Можно почитать/спросить у блоха он частенько обоснования свои на всяких конференция объяснял. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:22 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
lleming, lleming а есть варианты этого не делать ? Конечно, можно и не делать. Но утечка памяти - один из основных недостатков arrayList. И все-таки существует интерес понять, что с этим можно сделать. lleming Если вопрос почему в два раз то это questionable :)) Нет, это не вопрос, это была констатация. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:42 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
вадя, У тебя слова "быстро" затмевает все другие критерии. То есть почему решают и помечают черной краской антипаттерн. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:51 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 lleming, lleming а есть варианты этого не делать ? Конечно, можно и не делать. Но утечка памяти - один из основных недостатков arrayList. И все-таки существует интерес понять, что с этим можно сделать. Пользуйтсь ImmutableList из guava или List.of() Ваш КЭП f9n6001 lleming Если вопрос почему в два раз то это questionable :)) Нет, это не вопрос, это была констатация. см выше (ImmutableList и mutable by design ArrayList ) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:52 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 утечка памяти - один из основных недостатков arrayList ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 15:55 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 PetroNotC Sharp, PetroNotC Sharp f9n6001, Ну и reflection это антипаттерн)) У Вас есть альтернативное решение, как узнать реальный размер массива внутри arrayList'а? Вы сможете освободить память, сжав этот массив до разумного размера (не через .trimToSize() потому что после этого метода первая же вставка в аррэйлист пересоздаст массив и увеличит его размер в два раза)? Я думаю что твой вопрос особо не имеет смысла. Если ты собрался работать с фиксированным массивом (заведомо знаешь что будешь работать с пулом объектов) - то ответ очевиден. Бери обычный массив и работай. Если ты спрашиваешь какая формула роста (grows) работает в данный момент - то скорее всего тоже нет ответа. Надо смотреть версии JDK. Скорее всего эта формула менялась. Как и структура HashMap например. Всё эволюционирует. По поводу утечек памяти. Их там нету. Есть проблема аллокации последнего самого большого куска т.к. в эту самую секунду коллекции может делать копию Arrays.copyOf из старого экстента в новый и тут может не хватить Xmx. И опять-же это не утечка. Это нормальный рабочий режим работы коллекции. Вообще утечка - это другое. Это ошибка программиста. Утрата контроля над памятью. В реализации же данной коллекции нет явных ошибок. Чтобы не было спекуляций и разных кривых суждений - прошу смотреть исходный код здесь. https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/ArrayList.java ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 18:12 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
mayton Я думаю что твой вопрос особо не имеет смысла. Он спрашивает "как узнать". Хотя я предлагал вообще не узнавать). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:01 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
Мне кажется что любая попытка заниматься моделью памяти или перформансом в Java - тут-же выбивает тебя с уровня Java на уровень ОС и языков пониже уровнем типа "C". Об этом Шипилев неоднократно говорил. В задачах "обрезания" чего-либо ну... вот самое простое что напрашивается это создать новый ArrayList и скопировать туда ценную инфу с необрезанного. Тоесть вот на бизнес-уровне разработки я-бы на этом остановился. Уж коли ArrayList сам себя копирует во время grows то почему-бы мне его не скопировать всего 1 раз. Необрезанный потом можно обнулить присвоением пустого указателя. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:15 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
mayton По поводу утечек памяти. Их там нету. Есть проблема аллокации последнего самого большого куска т.к. в эту самую секунду коллекции может делать копию Arrays.copyOf из старого экстента в новый и тут может не хватить Xmx. И опять-же это не утечка. Это нормальный рабочий режим работы коллекции. IMHO 1. Сомнительно и какая-то надуманная проблема. Размер ссылки в ArrayList явно значительно меньше объектов, в нем хранящихся. Собственно объекты то копироваться не будет, будет копироваться (двойной размер) только хранилище ссылок который заведомо в разы и на порядки меньше, размера "всей" коллекции с объектами. Что бы сработал Ваш пример, ArrayList должен быть сильно разряженным (т.е. фактически пустым), а это явно "разработчик" постарался 2. ArrayList и вообще стандартные коллекции в Java, не есть наиболее эффективные/компактные хранилища. Особенно для атомарных типов и проблемы с боксингом/унбоксингом. На фоне этого, проблема N1 еще более надуманная. Решается переходом на не стандартные коллекции (коих полно) подозреваю ссылка в Java занимает не более 4 байт и, подозреваю, пустой Object занимает не менее 16 байт (Minimum object size is 16 bytes for modern 64-bit JDK since the object has 12-byte header, padded to a multiple of 8 bytes) т.е. в общем случае, сам массив не более (16+4)/4 = 1/5 от размера заполненной коллекции. В реальности еще меньше С учетом, что в классическом GC, как минимум одна из двух областей eden спейс по определению пустая + есть область именно для копирований - добится Out of memory при копировании ArrayList, это надо было еще и очень хорошо параметры JVM вручную настроить ))) В реальном проекте, а не в сферическом тесте с пустыми массивами ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:18 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
mayton Мне кажется что любая попытка заниматься моделью памяти или перформансом в Java - тут-же выбивает тебя с уровня Java на уровень ОС и языков пониже уровнем типа "C". Java создавали чтобы программист не занимался фсякой фигней). Ну по крайней мере в 90 проц задач учеток. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:26 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
В учебных примерах и собеседованиях сознательно создают ArrayList<Integer>. Чтоб усугубить тык-скыть проблему. Видимо им так удобно. И значения при удачном стечении обстоятельств (IntegerCache) могут мало занимать. Получается что ссылка - 4 байта + некое почти фиксированное число элементов кеша целых. Про коллекции типа trove я слышал. Но мы как-то в продуктовых проектах их не использовали. Не пригодились вобщем. Вот BitSet я использовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:27 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Сомнительно и какая-то надуманная проблема Ух ты. В чатике движуха. Это радует. То есть вы полагаете, что усечение arraylist не имеет практической пользы? Собственно из чего возник вопрос. Имеем лист, в который заносятся определенные данные. Поток этих данных может быть большим. Скажем, миллион записей. Дальше эти записи обрабатываются и по мере обработки удаляются из листа как неактуальные. В результате мы имеем под капотом листа массив на 2 млн ячеек, из которых реально заполнено 100. Когда случится следующий поток с данными - неизвестно, а массив в памяти бултыхается. Усекать его не имеет смысла? Поймите правильно, я действительно спрашиваю вас как более опытных в программировании специалистов. Наплевать и забыть или все-таки как-то обрабатывать эту ситуацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 09:31 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, может ArrayList заменить на что то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 09:43 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
am_sasa, на дерево? На связный список? am_sasa на что то другое на дерево? На связный список? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 10:58 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 Дальше эти записи обрабатываются и по мере обработки удаляются из листа как неактуальные. Вероятно вам надо очередь (без дополнительных функций связанного списка) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:02 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, Дерево причем к той фразе ТЗ от тебя?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:03 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Вероятно вам надо очередь нет, там сначала поиск объекта по uuid, а потом обработка объекта с последующим удалением из списка. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:44 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 PetroNotC Sharp, PetroNotC Sharp Вероятно вам надо очередь нет, там сначала поиск объекта по uuid, а потом обработка объекта с последующим удалением из списка. сначал ищем в Map по key, а потом удалем по ключю ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:50 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Дерево причем А, собственно, какие у нас варианты остаются? Все коллекции в Java строятся либо на массиве (аррэйлист, вектор, стек), либо на связных списках (линкедлист), либо на их симбиозе (хешмэп, хешсет), либо на красно-черном дереве (тримэп, трисет). Вот, если не аррэйлист на массиве, то на чём? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:54 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
чет мутная история с чего вдруг arraylist будет удлинять до милиона если всего 100 элеметов будет в нем. добавление с удалением если чередуется. Если не черезуется то возникает вопрос как поможет вообще что либо если нужно хранить милион объектов. Если понимается типа заполнить милионов и обработывать потихоньку удаляю и имеется ввиду что структура хранения сжимается потихоньку по мере удаления. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:54 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
lleming f9n6001 PetroNotC Sharp, пропущено... нет, там сначала поиск объекта по uuid, а потом обработка объекта с последующим удалением из списка. сначал ищем в Map по key, а потом удалем по ключю ? Аффтар! Ты теоретик или практик? ТЗ наконец внятно будет? Счас напишешь велосипед и потом его в мусорку ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:04 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Ты теоретик или практик? Теория без практики мертва и бесплодна. Практика без теории невозможна и пагубна. Для теории нужны знания, для практики сверх того, и умения. © М.В.Ломоносов. Прежде чем строить систему, надо уметь абстрагироваться, сложить у себя в уме модель и определиться, из каких, собственно, кирпичей, будем эту систему строить. На сколько я понимаю, именно этим и занимаются "архитекторы" в IT-компаниях. Вообще, способность к абстрактному мышлению - это именно то, что отличает человека от обезьяны. Вот интересная статья (не про обезьян) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 13:34 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
Мне кажется что структуру данных надо подбирать под конкретный бизней-кейс. Нет смысла обсуждать недостатки ArrayList в вакууме. Нам нужна задача на которой ArrayList повел себя плохо. Например делал ненужные аллокации или копирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 13:39 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
mayton, mayton Нет смысла обсуждать недостатки ArrayList в вакууме. Пока вот так написал. Потом посмотрю, на практике, надо ли оно вообще окажется. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:07 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001, Меня не слушаешь, mayton послушай. А так, ты как стас споришь против всех. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:07 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 Пока вот так написал. Потом посмотрю, на практике, надо ли оно вообще окажется. Код: java 1. 2. 3. 4.
Я не знаю где ты это собрался использовать но мне кажется что бегать рефлексией по системным библиотекам по скрытым полям - это путь в никуда. Точно также и данный вызов Код: java 1.
в зависимости от конкретной модели GC может не делать вообще ничего. Послушай лекции Шипилева на эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:19 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
f9n6001 Собственно из чего возник вопрос. Имеем лист, в который заносятся определенные данные. Поток этих данных может быть большим. Скажем, миллион записей. Дальше эти записи обрабатываются и по мере обработки удаляются из листа как неактуальные. В результате мы имеем под капотом листа массив на 2 млн ячеек, из которых реально заполнено 100. Когда случится следующий поток с данными - неизвестно, а массив в памяти бултыхается. Усекать его не имеет смысла? Поймите правильно, я действительно спрашиваю вас как более опытных в программировании специалистов. Наплевать и забыть или все-таки как-то обрабатывать эту ситуацию? По данному бизнес-кейсу. Попробуй использовать ArrayDeque https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ArrayDeque.html Она поддерживает интерфейс очереди Queue. Для обычных сценариев его должно хватить. Ну почти всем хватало. Особенно если ты хранишь не Integer/Long а какие-то осмыслленные бизнес объекты. Только высокочастотные трейдеры чего-то там другое искали и делали свои очереди с большей скоростью обработки. Но .... использовать их крайне неудобно. Вобщем стадартная Кьюшка или Дек (это по сути одно и тоже только в Дек можно пихать данные с двух сторон... ага как Газопровод по Украине) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:22 |
|
java reflectoion
|
|||
---|---|---|---|
#18+
mayton, mayton бегать рефлексией по системным библиотекам по скрытым полям - это путь в никуда. Да я понимаю, что это - плохое решение. И в реальном проекте скорее всего не пройдет, любой тимлид его забракует. А вот, например, в с# capacity доступен вполне себе легальными средствами . То есть в MS понимают, что штука так-то нужная. Но проработка вопроса - это в любом случае полезное дело для общего развития. mayton, Андрей Панфилов, вадя, lleming спасибо за конструктив. Тред (что логично) превращается в холивар, потому до новых встреч. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2022, 11:00 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120258]: |
0ms |
get settings: |
20ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
696ms |
get tp. blocked users: |
2ms |
others: | 368ms |
total: | 1159ms |
0 / 0 |