LINUX.ORG.RU

История изменений

Исправление 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") после каждой операции и смотри на показатели, после чего именно они растут особенно сильно