crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Постоянно течет память при исполнении скрипта
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ksth Дата 18.2.2011, 14:39
  Не уверен что поможет, но можно перед вызовом QScriptEngine::evaluate() делать pushContext (), а после popContext(). Насколько я понимаю данные имеют локальный характер, и возможно они увеличивают GlobalObject.
DEADHUNT Дата 6.9.2010, 22:50
  да это утечки Qt, тоже их замечал.
igor_bogomolov Дата 6.9.2010, 22:45
 
Цитата(DEADHUNT @ 6.9.2010, 23:21) *
и это спокоен? запусти с флагом --leak-check=full

Запускал так.
Цитата
valgrind --leak-check=full --track-origins=yes --show-reachable=yes --log-file=1.txt ./script
Файл с выводом здесь. Я не увидел там ничего криминального. Эти цифры постоянны и не зависят от того какое количество раз скрипт будет выполнен.

Да и поторопился я с предыдущим ответом. После n повторений, память расти перестает

DEADHUNT Дата 6.9.2010, 22:21
 
==13956== definitely lost: 124 bytes in 1 blocks <--
==13956== indirectly lost: 0 bytes in 0 blocks
==13956== possibly lost: 37,731 bytes in 530 blocks <--

и это спокоен? запусти с флагом --leak-check=full
Алексей1153 Дата 6.9.2010, 22:21
  igor_bogomolov, как "быстрый костыль" можно попробовать засунуть сиё в отдельный процесс (если логика приложения позволяет).

А ещё - может быть, есть какой-нибудь метод для очистки памяти именно в объекте scriptEngine - его вызывать периодически.

В конце концов, как костыль сойдёт, наверное, периодическое пересоздание объекта scriptEngine через new (со всеми синхронизациями, естественно, если это нужно)

По крайней мере, это всё можно попробовать для убедиться, что дело именно в этом месте
igor_bogomolov Дата 6.9.2010, 22:07
  Переделал немного таким образом
Раскрывающийся текст
#include <QtGui/QApplication>
#include <QtGui/QPushButton>
#include <QtCore/QDebug>
#include <QtScript/QScriptEngine>

class Test : public QObject
{
    Q_OBJECT
public slots:
    void evaluate() {
        for (int i=0; i!=1000;++i) {
            QString sFunction = QString( QLatin1String( "function vparam(a,b,c,d,e) { return (e<<16) | a | b | c | d; }" ) );
            QScriptValue sv = scriptEngine.evaluate( sFunction );
            if( scriptEngine.hasUncaughtException() )
            {
                qDebug() << "Script error";
                return;
            }

            QScriptValueList svlArgs;
            svlArgs << 0 << 0 << 0 << 0 << 1;

            QScriptValue fnObj = scriptEngine.globalObject().property( QLatin1String( "vparam" ) );
            QScriptValue fnRes = fnObj.call( QScriptValue(), svlArgs );

            QString sResult = fnRes.toString();
            if( sResult.isEmpty() )
            {
                qDebug() << "Script error";
                return;
            }

            qDebug() << sResult.toInt();
        }
    }
private:
    QScriptEngine scriptEngine;
};

#include "main.moc"

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    QPushButton button("text");

    Test test;

    QObject::connect(&button, SIGNAL(clicked()), &test, SLOT(evaluate()));

    button.show();
    return app.exec();
}

Valgrind можно сказать спокоен
"вывод valgrind"
Цитата
==13956== LEAK SUMMARY:
==13956== definitely lost: 124 bytes in 1 blocks
==13956== indirectly lost: 0 bytes in 0 blocks
==13956== possibly lost: 37,731 bytes in 530 blocks
==13956== still reachable: 135,512 bytes in 1,259 blocks
==13956== suppressed: 0 bytes in 0 blocks

Но в диспетчере задач, если нажимать на кнопочку, память постоянно растёт.

Я читал ваш комментарий по поводу диспетчера задач
Цитата
Память растет, потому что процесс запрашивает ее у ОС для своего хипа (кучи), но после освобождения памяти в хипе она не обязательно отдается системе обратно, а продолжает использоваться для аллокации внутри процесса. Поэтому, по диспетчеру и не видно ее освобождение.
В общем, диспетчер плохой инструмент для отлова утечек памяти внутри процесса.


Возможно диспетчер и плохой инструмент. Но память растёт непрерывно. За несколько дней начинает превышать 500 МБ и "планировщик" эту программу прибивает. Заказчик не доволен, т.к. программа должна работать непрерывно.

Возможно утечки есть и в другом месте. Сбивает то, что если я комментирую scriptEngine->evaluate утечки прекращаются.
BRE Дата 6.9.2010, 20:45
 
Цитата(igor_bogomolov @ 6.9.2010, 21:42) *
BRE, спасибо, сейчас попробую.
А какоя у вас версия Qt?

$ qmake-qt4 --version
QMake version 2.01a
Using Qt version 4.6.3 in /usr/lib64
igor_bogomolov Дата 6.9.2010, 20:42
 
Цитата(Алексей1153 @ 6.9.2010, 20:43) *
а с какой строчки кода именно начинает появляться проблема ?

QScriptValue sv = scriptEngine->evaluate(sFunction);



BRE, спасибо, сейчас попробую.
А какоя у вас версия Qt?
BRE Дата 6.9.2010, 20:38
  igor_bogomolov, проверь у себя этот код:
int main( int argc, char **argv )
{
    QCoreApplication app1( argc, argv );

    for( int i = 0; i < 100; ++i )
    {
        QScriptEngine scriptEngine;

        QString sFunction = QString( QLatin1String( "function vparam(a,b,c,d,e) { return (e<<16) | a | b | c | d; }" ) );
        QScriptValue sv = scriptEngine.evaluate( sFunction );
        if( scriptEngine.hasUncaughtException() )
        {
            qDebug() << "Script error";
            return 1;
        }

        QScriptValueList svlArgs;
        svlArgs << 0 << 0 << 0 << 0 << 1;

        QScriptValue fnObj = scriptEngine.globalObject().property( QLatin1String( "vparam" ) );
        QScriptValue fnRes = fnObj.call( QScriptValue(), svlArgs );

        QString sResult = fnRes.toString();
        if( sResult.isEmpty() )
        {
            qDebug() << "Script error";
            return 2;
        }

        qDebug() << sResult.toInt();
    }
    
    return 0;
}


Судя по выводу valgrind у меня ничего не течет.
Алексей1153 Дата 6.9.2010, 19:43
  igor_bogomolov, а с какой строчки кода именно начинает появляться проблема ? (можно определить половинным заремариванием функции)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.4.2024, 3:09