Утечка памяти

Страницы: 1
RSS
Утечка памяти, Происходит утечка памяти
 
Вопрос к знающим и к поддержке: почему происходит утечка памяти? Версия Quik 8.10.1.1

Ниже привожу коды скриптов. С первым память утекает просто моментально. Со вторым меньше и не так резво, но утечка все равно есть.
Код
is_run = true

function main()
  while is_run do
    local dt = os.date("!*t", os.time())
    sleep(500)
  end
end

function OnStop()
  is_run=false
end

Второй скрипт, утечка меньше, но имеется (нужно запустить и подождать минут 5, запомнив изначальное значение выделенной памяти)
Код
is_run = true

function main()
  while is_run do
    local curHour = tonumber(os.date("%H", os.time()))
    local curMin = tonumber(os.date("%M", os.time())) -- %S - сек
    local curDay = tonumber(os.date("%w", os.time())) -- диапазон, 0-6, соответствует Sunday-Saturday
    local year = tonumber(os.date("%Y", os.time()))
    local month = tonumber(os.date("%m", os.time()))
    local day = tonumber(os.date("%d", os.time()))
    sleep(500)
  end
end

function OnStop()
  is_run=false
end

Сразу поясню: эти два скрипта в таком виде НЕ несут смысловой нагрузки. Они являются лишь частью рабочего скрипта. Но именно этот код вызывает утечку. Посмотреть это можно открыв окно "Доступные скрипты" и наблюдать за колонкой "Память, KB". Для первого скрипта она будет расти, как бешеная сразу после запуска. Для второго не так сильно и куда медленнее, но расти будет.

Собственно, вопрос: че происходит?! Т.е. даже если нет сборщика мусора - это ведь не повод жрать память бесконтрольно! К слову сказать, обнуление переменных с помощью "х = nil" - не помогает! Использование глобальных переменных вместо local так же не помjгает! Отсюда вопрос: че за дичь?!
 
Цитата
Виталий написал:
Вопрос к знающим и к поддержке: почему происходит утечка памяти? Версия Quik 8.10.1.1
Для информации: Проверил первый скрипт у себя на 8.7 и 8.8 - всё в порядке. Растет незначительными темпами, а затем сбрасывается. Если вставить collectgarbage ("step"), то совсем незначительные колебания (отклонение в 10% от 40КБ до 44КБ), а если collectgarbage () - не изменяется вообще.
 
Цитата
Игорь М написал:
Цитата
Виталий написал:
Вопрос к знающим и к поддержке: почему происходит утечка памяти? Версия Quik 8.10.1.1
Для информации: Проверил первый скрипт у себя на 8.7 и 8.8 - всё в порядке. Растет незначительными темпами, а затем сбрасывается. Если вставить collectgarbage ("step"), то совсем незначительные колебания (отклонение в 10% от 40КБ до 44КБ), а если collectgarbage () - не изменяется вообще.
Спасибо. Дело не в том значительно или нет. Понятно, что на машине с ОЗУ 14Гб этого не будет заметно. Тем более на моих 32Гб ОЗУ. Но тут сама суть, что есть утечка, а быть ее не должно. Про сборщик мусора посмотрю сейчас чего это и как внедрить.
 
Это не утечка. Это Lua не делает уборку мусора, пока его не накопится "достаточно" для того, чтобы уборка имела смысл. Если постоянно дёргать сборщик мусора, то это будет замедлять исполнение программы. Возможно, что Lua имеет свои "представления" о том, когда надо запускать сборку мусора, и они не совпадают с Вашими. Можете, как уже советовали, запускать сборку мусора самостоятельно в подходящие на Ваш взгляд моменты.
 
Есть такая "особенность":
Вызов С функции форсирует более агрессивный режим работы сборщика мусора. Если код содержит много циклов с формированием локальных переменных, то мусор неохотно убирается.

Конструкция такого вида помогает, вместо прямого вызова сборщика.
       _G.SearchItems('money_limits', 0, 0, empty_func, "currcode")
Страницы: 1
Читают тему
Наверх