Anonymous
Привет, инженер Короны. Пока не требуется помощь, спасибо, я пока тыкаюсь в джаву, думаю это будет тоже не шибко длинный путь к моей цели
fgntfg
Меня больше всего расстраивает то, что программировать для телефона на телефоне практически невозможно
Anonymous
Я щас этим занимаюсь
Anonymous
Программа aide
fgntfg
У меня.
Anonymous
Только она платная
fgntfg
Три
Elias
И сюда репостну, т. к. людей тут много :)
Elias
Слайды Как бонус - почти вся моя речь в заметках к ним
Elias
Elias
Да
Snusmumriken
Там даже моя страшная морда есть.
Tverd
реквестирую видео... за презентацию спасибо!
Snusmumriken
Все, деанон, все срочно перестают уважать мой авторитет, потому что видели что в жизни я злобный карлик.
Tverd
Все, деанон, все срочно перестают уважать мой авторитет, потому что видели что в жизни я злобный карлик.
не думаю что все думали, что вживую ты блондин-богатырь, косая сажень в плечах
Tverd
😄
Snusmumriken
Блин, кстати тема. На следующий митап приду таким, сила моего авторитета тоже придет в норму.
Snusmumriken
Я про него и говорю :Р
Alexander
Слайды Как бонус - почти вся моя речь в заметках к ним
За сфмл отдельный респект, а видео где можно посмотреть?
K
Парни, а кто может поянить почему в Lua 5.2.4 require в одном случае результат функция, а в другом таблица?
K
Делаю pumakira = require './pumakira'; print(type(pumakira)) и получаю function
K
А как понять где разраб это решил? По каким признакам в коде?
K
Благодарствую! Пошел ковырять исходник.
_AMD_
Где можно почитать про утечки памяти в луа и как их не допускать?
Snusmumriken
Так же как и в любом другом языке. а) все типы кроме атомарных (строки, числа) являются ссылками. б) цикл из ссылок таблиц-объектов друг на друга образуют "остров", чтобы не допускать - вешаешь слабую ссылку на что-нибудь, разрывая кольцо.
_AMD_
Можно пример по б)?
Snusmumriken
tbl1 = {} tbl2 = {link = tbl1} tbl3 = {link = tbl2} tbl1.link = tbl3 tbl1, tbl2, tbl3 = nil, nil, nil Всё, у нас есть остров.
_AMD_
Тоесть, тут утечка. А как ее предотвратить?
Snusmumriken
tbl1 = setmetatable({}, {__mode = 'v'}) tbl2 = {link = tbl1} tbl3 = {link = tbl2} tbl1.link = tbl3 tbl1, tbl2, tbl3 = nil, nil, nil Всё, острова нет, ссылка на значения у tbl1 - слабая, если удалилась tbl3 - всё остальное по цепочке удалится.
_AMD_
Все из-за mode v?
Snusmumriken
Ага.
_AMD_
С этими mode как раз и не разобрался в метатаблицах
Snusmumriken
https://habrahabr.ru/post/163679/
_AMD_
Да, видел твой пост (если это твой. Сейчас смотреть неудобно)
_AMD_
Но честно скажу — не читал) считал, что в метатаблицах разбираюсь достаточно хорошо)
Snusmumriken
Это не мой. Я давал в моём посте ссылку на это, как раз для близкого рассмотрения слабых ссылок.
Snusmumriken
На самом деле можно и без метатаблиц. tbl1 = {} tbl2 = {link = tbl1} tbl3 = {link = tbl2} tbl1.link = tbl3 tbl1.link = nil -- разрываем кольцо ручками tbl1, tbl2, tbl3 = nil, nil, nil Ну тут типа чистка ссылок чтобы не было колец.
_AMD_
Спасибо. Буду дома, то, если найду спрошу еще кое-что на эту тему у тебя
Snusmumriken
Я прост сам всегда делаю деревья из таблиц, а если где-то есть лишние буферы/индексы - или они удаляются сами, или выставляется режим слабых ссылок. Данный режим я практически никогда не использую, ибо организация проектов не способствует циклическим ссылкам. Но вот если у тебя, допустим, есть игрушка, в которой есть персонажи с инвентарём, и ты удаляешь объект из игрового мира и хочешь чтобы он удалился и из инвенторя тоже - делаешь инвентарь таблицей слабых ссылок и собираешь мусор после удаления объекта из игрового мира.
_AMD_
А можно как-то быстро найти все «дырявые» места?
Vasiliy
Снус, ты чего? ГЦ же все отлично соберет в твоем примере.
Vasiliy
острова пофигу, если до объекта никак не добраться из рантайма (через _G к примеру) то его соберут
Vasiliy
помимо _G, наверное еще есть registry - туда С код может что-то пихать
Snusmumriken
Снус, ты чего? ГЦ же все отлично соберет в твоем примере.
В первом, где цикл из ссылок - нет, не соберёт.
Tverd
Я тоже заинтриговался тем, что если три таблицы в nil то они не удалятся, если есть кроссылки... я так понимаю для этого и есть стадии в сборщике мусора... с чего Снус ты это взял?
Tverd
щас даже проверю...
Snusmumriken
Сборщик мусора считает количество жёстких ссылок на объект. Если количество >0 то объект остаётся жив. Ссылки по умолчанию - жёсткие.
Tverd
local tbl1 = {} local tbl2 = {link = tbl1} local tbl3 = {link = tbl2} tbl1.link = tbl3 tbl1._proxy = newproxy(true) getmetatable(tbl1._proxy).__gc = function() print('__GC') end -- tbl1.link = nil -- разрываем кольцо ручками tbl1, tbl2, tbl3 = nil, nil, nil
Tverd
ну в общем сборщик сработал
Snusmumriken
Тут - конечно сработает, кольцо-то разорвано.
Tverd
неа, закоменчено
Snusmumriken
А.
Tverd
в осли бы такая фигня была, это был бы очень фатальный недостаток... И фиг тогда как это дебажить
Snusmumriken
Ну, утечки памяти - довольно стрёмная штука которую сложно дебажить.
Snusmumriken
Ну, значит у луёв сборка мусора ещё проверяет на связь с таблицей _G, хе. Век живи век учись )) Тогда утечки в несколько раз сложнее организовать. В питоне аналогичное замечательно работает, и острова примерно так же легко сделать, хоть там и сборка мусора значительно быстрее.
Vasiliy
не проверяет на _G. Просто он помечает доступность. Остров, который не доступен ни откуда - обречен.
Snusmumriken
А как он обнаружит доступность у острова? Генерировать граф для Каждого Объекта? Очень медленно.
Snusmumriken
И да, "не доступен ни откуда" - а откуда можно быть доступным? Из другого острова? Чем вообще остров отличается от не-острова, и где "корень который точно нельзя вычищать" как не таблица _G?
Anonymous
Ребята в питоне гц обнаруживает циклы
Snusmumriken
Ну я про древние питоны, начало второй версии.
Anonymous
Странно что в луа такой стремный гц
Anonymous
Уж циклы то надо
Anonymous
Или может снус не про это говорит
Anonymous
Я чет не понимаю. Луа же хороший сам интерпретатор, гц тоже должен быть норм
Snusmumriken
Не совсем, гц в луа полирует много чего лишнего при сборке. Роберто на прошлом митапе в мейле как раз говорил о его модификациях в lua 5.4. Но да, ща читаю про гц, он типа обсервативный, т.е. шарит по ссылкам начиная с _G и помечает объекты как "живые", как пройдёт по всем объектам - удалит всё не помеченное (ссылочно не стыкуется к _G). Да, он удалит вообще всё, островов не будет, хоть и не особо быстро.
Snusmumriken
Майк Пол тоже много вопил на тему "нового сборщика мусора", мб даже закончит, особенно если его профинансируют : )
Snusmumriken
Ребзя, ни у кого не завалялось пол ляма-лям?
Snusmumriken
Ну, сначала надо же спросить, вдруг завалялось в весенней ветровке.
Snusmumriken
Кидаем в Майка деньги!
Tverd
Vasiliy
лям - это же доллариев, да?
Snusmumriken
Ну хотя бы рублиев. Ты перерыл весенние ветровки и нашёл закатившийся в дырку кармана лям?
Vasiliy
а этот, registry он тоже в _G валяется? тот куда пинятся объекты с помощью luaL_ref()
Vasiliy
думается, кроме _G можно еще места найти ) но это детали
Vasiliy
Лям рублей это 16к баксов. Даже я бы не взялся
Snusmumriken
а этот, registry он тоже в _G валяется? тот куда пинятся объекты с помощью luaL_ref()
Реестр виртуальный, т.е. там есть всякие специальные значения куда/откуда можно вытянуть данные (например, upvalue или из локальных ссылок или ещё откуда-то), но по умолчанию - да, к _G пинятся.
Snusmumriken
А ещё, лям - это всего 20 таких монеток. Они по 5кг, кстати, быстро дырки в карманах делают и теряются там навсегда.
Vasiliy
да )