powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / java reflectoion
25 сообщений из 38, страница 1 из 2
java reflectoion
    #40129852
f9n6001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
Кто-нибудь понимает, чего не хватает 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
java reflectoion
    #40129856
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f9n6001,

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

спасибо!

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

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

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


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


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

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

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

спасибо!

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

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

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

f9n6001

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

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


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


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

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

f9n6001

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

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

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


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


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

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

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

f9n6001

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


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

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

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

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

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

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


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

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

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

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

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

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

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


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