Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / java reflectoion / 25 сообщений из 38, страница 1 из 2
27.01.2022, 12:21
    #40129852
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
Привет.
Кто-нибудь понимает, чего не хватает 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.
import java.lang.reflect.Field;
import java.util.ArrayList;

public class Test4 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException {

        ArrayList<String> l1 = new ArrayList<>(1000);

        for (int i = 0; i < 10; i++) {
            l1.add(Integer.toString(i));
        }
        l1.ensureCapacity(20);

// =====================================================

        Class l1Reflection = l1.getClass();
        Field[] fields = l1Reflection.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName() + ";" + field.getType());
        }

        Field defaultCapacityField = l1Reflection.getDeclaredField("DEFAULT_CAPACITY");
        defaultCapacityField.setAccessible(true);
        int defaultCapacity = defaultCapacityField.getInt(l1Reflection);
        System.out.println(defaultCapacity);

        Field maxArraySizeField = l1Reflection.getDeclaredField("MAX_ARRAY_SIZE");
        maxArraySizeField.setAccessible(true);
        System.out.println(maxArraySizeField.getInt(l1Reflection));

    /*    Field sizeField = l1Reflection.getDeclaredField("size");
        sizeField.setAccessible(true);
        System.out.println(sizeField.get(l1Reflection));*/

        Field capacityField = l1Reflection.getDeclaredField("elementData");
        capacityField.setAccessible(true);
        int currentCapacity = ((Object[]) capacityField.get(l1Reflection)).length;
        System.out.println(currentCapacity);
    }
}


...
Рейтинг: 0 / 0
27.01.2022, 12:35
    #40129856
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001,

int currentCapacity = ((Object[]) capacityField.get(l1)).length;
...
Рейтинг: 0 / 0
27.01.2022, 13:10
    #40129872
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
Андрей Панфилов,

спасибо!

Ну и вдогонку пара вопросов, из-за чего я все это затеял.

1. Похоже, у arrayList нет возможности обрезать capacity до произвольного значения (не до size)?

2. Вроде как в документации по Java написано, что классические массивы не рекомендуется использовать, а вместо них везде надо использовать аррэйлист. На практике так и делают? В реальных проектах действительно все построено на аррэйлистах и никто не использует массивы в чистом виде?
...
Рейтинг: 0 / 0
27.01.2022, 14:18
    #40129903
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001,
Использовать списки и коллекции а не конкретно одно имя.
Так же как вместо тупых указателей на память используют умные.
Так же как вместо руками obj.free() используют сборщик мусора.
И т.и т.п.
...
Рейтинг: 0 / 0
27.01.2022, 14:27
    #40129910
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001,
Ну и reflection это антипаттерн))
...
Рейтинг: 0 / 0
27.01.2022, 14:54
    #40129922
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
PetroNotC Sharp,


PetroNotC Sharp
f9n6001,
Ну и reflection это антипаттерн))


У Вас есть альтернативное решение, как узнать реальный размер массива внутри arrayList'а?

Вы сможете освободить память, сжав этот массив до разумного размера (не через .trimToSize() потому что после этого метода первая же вставка в аррэйлист пересоздаст массив и увеличит его размер в два раза)?
...
Рейтинг: 0 / 0
27.01.2022, 14:58
    #40129926
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
Программерам вообще свойственно очень вольно относиться к аппаратным ресурсам, а админы потом голову чешут, как заставить работать то чудо, которые наваяли вышеуказанные разработчики.

Билл Гейтс в свое время бил пяткой в грудь, что 640 kb базовой памяти хватит всем и всегда. Ага. Да. Конечно.
...
Рейтинг: 0 / 0
27.01.2022, 15:02
    #40129928
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001
Андрей Панфилов,

спасибо!

Ну и вдогонку пара вопросов, из-за чего я все это затеял.

1. Похоже, у arrayList нет возможности обрезать capacity до произвольного значения (не до size)?

Под arrayList поднимается java.util.ArrayList то через copy. Если скучно можно свое сделать переопределив

f9n6001

2. Вроде как в документации по Java написано, что классические массивы не рекомендуется использовать, а вместо них везде надо использовать аррэйлист. На практике так и делают? В реальных проектах действительно все построено на аррэйлистах и никто не использует массивы в чистом виде?

по обстоятельствам, в array можно ошибиться и сделать чтото не так либо попрортить. Там где много модификаций Arrays.systemCopy возможно будет бить по перфомансу.
Вот всяких десиалайзерах(и не только) часто вместо чистого bytearray пользуются ByteReference или ByteBuffer
...
Рейтинг: 0 / 0
27.01.2022, 15:05
    #40129930
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001,
Ты изучи коллекции, списки.
Потом поговорим.
Это каждый джун должен знать.
...
Рейтинг: 0 / 0
27.01.2022, 15:06
    #40129931
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
PetroNotC Sharp
f9n6001,
Ну и reflection это антипаттерн))
Сишники эмулируют это, дабы использовать
и нисколько ни антипаттерн. в первых числах было медленным, но счас даже очень быстрым сделали
...
Рейтинг: 0 / 0
27.01.2022, 15:22
    #40129939
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001
PetroNotC Sharp,


PetroNotC Sharp
f9n6001,
Ну и reflection это антипаттерн))


У Вас есть альтернативное решение, как узнать реальный размер массива внутри arrayList'а?

переопредели ArrayList и добавь метод который вернет размер

f9n6001

Вы сможете освободить память, сжав этот массив до разумного размера (не через .trimToSize() потому что после этого метода первая же вставка в аррэйлист пересоздаст массив и увеличит его размер в два раза)?

а есть варианты этого не делать ? Если вопрос почему в два раз то это questionable. Тут Можно почитать/спросить у блоха он частенько обоснования свои на всяких конференция объяснял.
...
Рейтинг: 0 / 0
27.01.2022, 15:42
    #40129943
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
lleming,
lleming
а есть варианты этого не делать ?

Конечно, можно и не делать. Но утечка памяти - один из основных недостатков arrayList. И все-таки существует интерес понять, что с этим можно сделать.


lleming
Если вопрос почему в два раз то это questionable


:)) Нет, это не вопрос, это была констатация.
...
Рейтинг: 0 / 0
27.01.2022, 15:51
    #40129948
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
вадя,
У тебя слова "быстро" затмевает все другие критерии. То есть почему решают и помечают черной краской антипаттерн.
...
Рейтинг: 0 / 0
27.01.2022, 15:52
    #40129949
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001
lleming,
lleming
а есть варианты этого не делать ?

Конечно, можно и не делать. Но утечка памяти - один из основных недостатков arrayList. И все-таки существует интерес понять, что с этим можно сделать.

Пользуйтсь ImmutableList из guava или List.of()
Ваш КЭП

f9n6001

lleming
Если вопрос почему в два раз то это questionable


:)) Нет, это не вопрос, это была констатация.

см выше (ImmutableList и mutable by design ArrayList )
...
Рейтинг: 0 / 0
27.01.2022, 15:55
    #40129953
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001
утечка памяти - один из основных недостатков arrayList
это серьезно? "а мужики то не знали" (с)
...
Рейтинг: 0 / 0
27.01.2022, 18:12
    #40130012
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
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
...
Рейтинг: 0 / 0
27.01.2022, 19:01
    #40130042
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
mayton
Я думаю что твой вопрос особо не имеет смысла.
ты прав. Мне всегда везло на вопросы по архитектуре лишенные смысла.
Он спрашивает "как узнать". Хотя я предлагал вообще не узнавать).
...
Рейтинг: 0 / 0
27.01.2022, 19:15
    #40130046
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
Мне кажется что любая попытка заниматься моделью памяти или перформансом в Java - тут-же
выбивает тебя с уровня Java на уровень ОС и языков пониже уровнем типа "C".

Об этом Шипилев неоднократно говорил.

В задачах "обрезания" чего-либо ну... вот самое простое что напрашивается это создать новый ArrayList
и скопировать туда ценную инфу с необрезанного. Тоесть вот на бизнес-уровне разработки я-бы на этом
остановился. Уж коли ArrayList сам себя копирует во время grows то почему-бы мне его не скопировать
всего 1 раз. Необрезанный потом можно обнулить присвоением пустого указателя.
...
Рейтинг: 0 / 0
27.01.2022, 19:18
    #40130047
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
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 вручную настроить ))) В реальном проекте, а не в сферическом тесте с пустыми массивами
...
Рейтинг: 0 / 0
27.01.2022, 19:26
    #40130048
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
mayton
Мне кажется что любая попытка заниматься моделью памяти или перформансом в Java - тут-же
выбивает тебя с уровня Java на уровень ОС и языков пониже уровнем типа "C".
да.
Java создавали чтобы программист не занимался фсякой фигней).
Ну по крайней мере в 90 проц задач учеток.
...
Рейтинг: 0 / 0
27.01.2022, 19:27
    #40130049
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
В учебных примерах и собеседованиях сознательно создают ArrayList<Integer>. Чтоб усугубить тык-скыть проблему.

Видимо им так удобно. И значения при удачном стечении обстоятельств (IntegerCache) могут
мало занимать. Получается что ссылка - 4 байта + некое почти фиксированное число элементов кеша целых.

Про коллекции типа trove я слышал. Но мы как-то в продуктовых проектах их не использовали.
Не пригодились вобщем. Вот BitSet я использовал.
...
Рейтинг: 0 / 0
28.01.2022, 09:31
    #40130150
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
Leonid Kudryavtsev
Сомнительно и какая-то надуманная проблема


Ух ты. В чатике движуха. Это радует.

То есть вы полагаете, что усечение arraylist не имеет практической пользы?

Собственно из чего возник вопрос.
Имеем лист, в который заносятся определенные данные. Поток этих данных может быть большим. Скажем, миллион записей. Дальше эти записи обрабатываются и по мере обработки удаляются из листа как неактуальные. В результате мы имеем под капотом листа массив на 2 млн ячеек, из которых реально заполнено 100. Когда случится следующий поток с данными - неизвестно, а массив в памяти бултыхается.

Усекать его не имеет смысла?
Поймите правильно, я действительно спрашиваю вас как более опытных в программировании специалистов. Наплевать и забыть или все-таки как-то обрабатывать эту ситуацию?
...
Рейтинг: 0 / 0
28.01.2022, 09:43
    #40130154
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001,

может ArrayList заменить на что то другое?
...
Рейтинг: 0 / 0
28.01.2022, 10:58
    #40130180
f9n6001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
am_sasa,

на дерево? На связный список?
am_sasa
на что то другое

на дерево? На связный список?
...
Рейтинг: 0 / 0
28.01.2022, 11:02
    #40130181
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java reflectoion
f9n6001
Дальше эти записи обрабатываются и по мере обработки удаляются из листа как неактуальные.
fifo? lifo?
Вероятно вам надо очередь (без дополнительных функций связанного списка)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / java reflectoion / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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