FloatArray, и вся фигня в том что размер его постоянно меняется, конечно можно создать один огромный массив и его использовать, попытка оптимизации, но есть и другие места, где такое не прокатит, вот вопрос, как мне Создать обьект и реально его уничтожить, чтобы он не складировался и ждал своего часа в GC а реально освободил ресурсы, это в котлине вообще возможно?
Никак
Так как нужно будет место GC и вызовется и почистит что не нужно
Разве при этом не замораживается приложение?
ну в андроиде он уже вроде в отдельном потоке всё это делает, если я не путаю
Не надо подсказывать GC как делать его работу, он умный и так. Освободит память если уже не надо. Но если очень хочется можно сделать myBigFloatArray = null или FloatArray(1) если он не нуллабельный, это с гарантией сделает старый большой массив доступным сборщику
Ну это FloatArray(1) похоже на то чтобы прошлый массив потерял ссылку на объект ибо создастся новый объект, это больше похоже на то чтобы GC просто быстрее его нашел что нужно грохнуть при следующей сборке мусора, не уверен что будет особый выигрыш, ибо мы сами не освободили ресурс ка на Си. Интересно как обстоят дела с BufferArray и сборкой мусора
Невозможно, котлин тут не причем
Скажем так, для того что бы сборщик собрал гигабайтный массив надо что бы на него не было активных ссылок Допустим у нас есть полугигабайтный массив а1 и надо создать новый такого же размера а2, а старый уже не нужен Val a2=ByteArray(500 000 000) может кинуть ООМ потому что старый массив а1 еще имеет ссылки хотя программисту и не нужен уже a1=null Val a2=ByteArray(500 000 000) гарантирует возможность сборки a1 перед отведнием памяти для а2. Это самое близкое к сишному освобождению памяти
Пока GC не снесет a1 хоть мы и дали ему null мы успеем создать а2, и реально получим гиг занятого пространства, а когда GC раздуплится, тогда и освободит a1, это я ловлю переполнения на устройстве с 1гиг ОЗУ, есть старый телефон на A7 именно для теста, что если на таком старом двуядерном говне приложение будет работать, значит и у пользователей будет работать. Хорошо иметь старые телефоны для теста приложения, какой смысл тестить на телефоне с 18 гиг ОЗУ)
Если памяти на a2 не хватает и при ее отведении будет ООМ gc вызовется немедленно и соберет все что может включая а1
По идее я понимаю что в этот момент GC должен заморозить приложение, пока не освободит память, ибо а2 выделение должно ждать тогда пока место не освободится, и если места ваще нет после GC то креш outofmemory, я так понял
Обсуждают сегодня