Dmitry
вот чел пишет https://stackoverflow.com/a/24377086
Michael
https://play.golang.org/p/g-kV89MP6z
на Windows 10 & Go 1.9 beta 2 освобождение памяти наблюдается, но система всё же уходит в дикий своп
Michael
https://play.golang.org/p/TsbdchuCE1 кол-во эл-ов подбирал под свой пк
hamper 𓅝
А почему такая фигня у меня происходит? x := map[string]map[string]float64{} ... // тут заполняем x m.Lock() m.i = x m.Unlock() дальше читаю только из m.i с RLock() но детектится рейс при чтении из m.i одновременно с записью в x. Это компилятор решил что можно x не создавать и сразу писать в m.i и вышло что я пишу в него до лока?
hamper 𓅝
если перед созданием x ставлю m.Lock() defer m.Unlock() то все работает
hamper 𓅝
Хотя x это же временная переменная, которую я хочу заполнить медленно и заменить m.i на нее.
Anonymous
Поставил паузу на 10 минут, жду :)
10 минут, никто память не отдал
Dmitry
хм...
Anonymous
нужен код, так трудно понять что наворочено ))
hamper 𓅝
Да в начало запихал этот лок и все нормально стало, просто как-то странновато было.
Anonymous
Не, ниотдаёт никто
Anonymous
Видимо российский менталитет - нахпать побольше и не делиться ))
Michael
сколько физической озу и сколько потребляется каждым процессом?
Anonymous
1 гб, запускаю два процесса по 300 мб
Michael
ну так там и третий поместится
Michael
и четвёртый валетиком
Dmitry
1 гб, запускаю два процесса по 300 мб
запускал твой код, и на моей машине занимал ~700Mb памяти. но когда заменил map[int]int на map[string]int стало занимать ~130Mb памяти
Dmitry
да, может утечка памяти как раз в том, что ключ числовое значение?
Dmitry
так же работает :(
Сережа
ну уж не на столько ваш гоу днище, что там встроенные типы текут
Сережа
вопрос в том, что такое стринг в гау, я думаю в гау стринг как и в джаве неизменяемый и если ты вставляешь в мапу один и тот же стринг
Сережа
память под него выделяется единожды, а вставляешь ты как бы структуру с указателем на содержимое строки
Сережа
а инт наверное каждый раз на хипе выделяется
Сережа
такой вот я шерлок холмс
Сережа
только не умею объяснять свою мысль доходчиво(((((((
Сережа
хотя не, структура наверное больше бы инта весила, херню спорол
Сережа
там наверное оптимизация
Сережа
инт это же примитив в 32 байта?
Dmitry
вот так вставляю m[string(i)] = i
Anonymous
инт это же примитив в 32 байта?
32 для 32-битной системы
Сережа
а меряешь потребляемую память как?
Anonymous
Я process hacker'ом, private bytes
Anonymous
под linux htop, колонка res
Сережа
стой, у тебя же стринги это ключ, а мапа - это хешмапа и от стринга хэш-функция считается может стринг выделяется на стеке
Сережа
но вообще мне не понятно откуда такая разница
Сережа
у меня получилось при map[int]int
Сережа
Kbytes RSS Dirty
Сережа
4884732 4882068 4880980
Сережа
при map[string]int
Сережа
4884732 4881888 4880864
Michael
строки иммутабельны, какая-нить интерполяция или интернинг строк отработал
Сережа
что можно объяснить тем, что в мапе хранится не ключ, а результат хеш функции по ключу, который наверное одинакового размера, что от инта, что от строки
Сережа
да не, там поцан говорил, что при map[string]int у него мапа меньше, я проверил, у меня вроде нет
Michael
есть оверинжинирнг
Сережа
либо я что-то сделал не так
Michael
а сейчас мне кажеться овер теоретинг
Michael
и всё чтобы не писать код
Сережа
да, если ты задумываешься об этом и пишешь на го, то ты взял не тот инструмент
Michael
джава создана быть медленной
Michael
Го создан быть быстрым
Сережа
с гербейдж коллектором
Сережа
и рефлексией
Michael
10 минут, никто память не отдал
ещё с одного пк запустил тест: три запуска - три разных результата 1 - первый инстанс поделился памятью 2 - раз ОС предложила кикнуть первый инстанс 3 - раз тест отработал без каких либо вопросов
Michael
Michael
ос - Windows 10
Michael
взависмости от конфигурации пк и настроек го система как-то сама решает вопросы с кучами
Michael
на тутрубе есть видео с конференциц gophercon uk & gopher fest
Michael
там примерное также говорится по поводу освобождения памяти
Michael
и оф доки говорят следующее https://golang.org/pkg/runtime/debug/#FreeOSMemory
Michael
Even if this is not called, the runtime gradually returns memory to the operating system in a background task
Сережа
Если ты будешь менять дата сегмент процесс упадет по сегфолту
Сережа
Ставлю на то, что строки хранятся в дата сегменте
Сережа
Ты можешь мапировать его
Сережа
Но это не случайно, а целенаправленно
Kirill
Но, как факт - строка это обычная структура со слайсом байт
Kirill
И длиной
Michael
с отриц сдвигом
Kirill
https://play.golang.org/p/LRC2ErdRLa
Dmitriy / დიმიტრი
Что-то с Gogland вообще всё печально. За день уже 30-й раз напрочь подвисает.