История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Строки в lua
уникальны и неизменяемы, если ты изменил строку, значит ты её предыдущую копию выбросил в мусор. Если ты изменил 1000 строк типа
local str="hello"
str=str.."world"
То сейчас в мусоре лежит указатель на две строки «hello» что была и «world» что временная. Ты не изменил строку в переменной str
ты создал новую на основе двух, и эти две выкинул фпамойку.
В псевдосишке наивно выглядело бы это так
char * str = malloc(5+1);
sprintf(str,"%s","hello");/*local str="hello"*/
char * stx = malloc(5+1);
sprintf(stx,"%s","world"); /*анонимный "world"*/
char * buf = malloc(strlen(str)+strlen(stx)+1);
sprintf(buf,"%s%s",str,stx); /*str.."world"*/
/*Для сборщика мусора теперь есть, вот эта работа*/
free(str);
free(stx);
str = buf; /*str=str.."world"*/
Это просто пример, такого даже близко там не происходит. Но суть, откуда берётся мусор, думаю ясна.
Хочешь узнать откуда память, выполняй collectgarbage("count")
после каждой операции и смотри на показатели, после чего именно они растут особенно сильно
Но, это я так, мысли в слух. Может кто умный придёт и что по делу скажет :)
Исправление LINUX-ORG-RU, :
Строки в lua
уникальны и неизменяемы, если ты изменил строку, значит ты её предыдущую копию выбросил в мусор. Если ты изменил 1000 строк типа
local str="hello"
str=str.."world"
То сейчас в мусоре лежит указатель на две строки «hello» что была и «world» что временная. Ты не изменил строку в переменной str
ты создал новую на основе двух, и эти две выкинул фпамойку.
В псевдосишке наивно выглядело бы это так
char * str = malloc(5+1);
sprintf(str,"%s","hello");/*local str="hello"*/
char * stx = malloc(5+1);
sprintf(stx,"%s","world"); /*анонимный "world"*/
char * buf = malloc(strlen(str)+strlen(stx)+1);
sprintf(buf,"%s%s",str,stx); /*str.."world"*/
/*Для сборщика мусора теперь есть, вот эта работа*/
free(str);
free(stx);
str = buf; /*str=str.."world"*/
Это просто пример, такого даже близко там не происходит. Но суть, откуда берётся мусор, думаю ясна.
Хочешь узнать откуда память, выполняй collectgarbage("count")
после каждой операции и смотри на показатели, после чего именно они растут особенно сильно
Но, это я так, мысли в слух. Мождет кто умный придёт и что по делу скажет :)
Исходная версия LINUX-ORG-RU, :
Строки в lua
уникальны и неизменяемы, если ты изменил строку, значит ты её предыдущую копию выбросил в мусор. Если ты изменил 1000 строк типа
local str="hello"
str=str.."world"
То сейчас в мусоре лежит указатель на две строки «hello» что была и «world» что временная. Ты не изменил строку в переменной str
ты создал новую на основе двух, и эти две выкинул фпамойку.
В псевдосишке наивно выглядело бы это так
char * str = malloc(5+1);
sprintf(str,"%s","hello");/*local str="hello"*/
char * stx = malloc(5+1);
sprintf(stx,"%s","world"); /*анонимный "world"*/
char * buf = malloc(strlen(str)+strlen(stx)+1);
sprintf(buf,"%s%s",str,stx); /*str.."world"*/
/*Для сборщика мусора теперь есть, вот эта работа*/
free(str);
free(stx);
str = buf; /*str=str.."world"*/
Это просто пример, такого даже близко там не происходит. Но суть, откуда берётся мусор, думаю ясна.
Хочешь узнать откуда память, выполняй collectgarbage("count")
после каждой операции и смотри на показатели, после чего именно они растут особенно сильно