|
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 |
|
|
start [/forum/topic.php?fid=59&msg=40130047&tid=2120258]: |
0ms |
get settings: |
27ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
467ms |
get tp. blocked users: |
2ms |
others: | 2238ms |
total: | 2815ms |
0 / 0 |