Профилирование использования памяти Perl и обнаружение утечки?

Необходимо смочь использовать некоторый другой фон. Если Вы не видите другой стандарт backgrunds, нажмите на мало плюс значок и перейдите к /usr/share/backgrounds. Там необходимо найти все стандартные фоны.

33
задан Chankey Pathak 20 September 2016 в 07:42
поделиться

4 ответа

У вас может быть круговая ссылка в одном из ваших объектов. Когда приходит сборщик мусора, чтобы освободить этот объект, циклическая ссылка означает, что все, на что ссылается эта ссылка, никогда не будет освобождено. Вы можете проверить циклические ссылки с помощью Devel :: Cycle и Test :: Memory :: Cycle . Одна вещь, которую стоит попробовать (хотя в производственном коде это может быть дорого, поэтому я бы отключил его, если флаг отладки не установлен), это проверка циклических ссылок внутри деструктора для всех ваших объектов:

# make this be the parent class for all objects you want to check;
# or alternatively, stuff this into the UNIVERSAL class's destructor
package My::Parent;
use strict;
use warnings;
use Devel::Cycle;   # exports find_cycle() by default

sub DESTROY
{
    my $this = shift;

    # callback will be called for every cycle found
    find_cycle($this, sub {
            my $path = shift;
            foreach (@$path)
            {
                my ($type,$index,$ref,$value) = @$_;
                print STDERR "Circular reference found while destroying object of type " .
                    ref($this) . "! reftype: $type\n";
                # print other diagnostics if needed; see docs for find_cycle()
            }
        });

    # perhaps add code to weaken any circular references found,
    # so that destructor can Do The Right Thing
}
14
ответ дан 27 November 2019 в 19:28
поделиться

Вы можете используйте Devel :: Leak для поиска утечек памяти. Однако документация довольно скудная ... например, где взять ссылку $ handle для перехода к Devel :: Leak :: NoteSV () ? Если я найду ответ, я отредактирую этот ответ.

Оказывается, использовать этот модуль довольно просто (код без зазрения совести украден из Apache :: Leak ):

use Devel::Leak;

my $handle; # apparently this doesn't need to be anything at all
my $leaveCount = 0;
my $enterCount = Devel::Leak::NoteSV($handle);
print STDERR "ENTER: $enterCount SVs\n";

#  ... code that may leak

$leaveCount = Devel::Leak::CheckSV($handle);
print STDERR "\nLEAVE: $leaveCount SVs\n";

I Поместите как можно больше кода в средний раздел, с проверкой leaveCount как можно ближе к концу выполнения (если он у вас есть) - после того, как большинство переменных будет освобождено, насколько это возможно (если вы не можете получить переменная вне области видимости, вы можете присвоить ей undef, чтобы освободить все, на что она указывала).

10
ответ дан 27 November 2019 в 19:28
поделиться

Brofield,

У меня была точно такая же проблема, и я только что наткнулся на решение, которое не требует преобразования исходных строк в широкие символы и обратно: сохраните исходный файл как UTF-8 без подписи , и VC2008 оставит его в покое. Отлично сработало, когда я придумал опустить подпись. Подводя итог:

Unicode (UTF-8 без подписи) - кодовая страница 65001, не части вашей программы или сегментируйте ее на отдельные исполняемые файлы (они могут использовать сигналы для связи или, возможно, вызывать друг друга с аргументами командной строки) - цель состоит в том, чтобы свести исполняемый файл к наименьшему количеству кода, который по-прежнему демонстрирует плохое поведение . Если вы уверены, что это делает не ваш код, уменьшите количество используемых вами внешних модулей, особенно тех, которые имеют реализацию XS. Если, возможно, это ваш собственный код, ищите что-нибудь потенциально подозрительное:

  • определенно любое использование кода Inline :: C или XS
  • прямое использование ссылок, например \ @ list или \% hash , а не предварительно выделенные ссылки, такие как [qw (foo bar)] (первая создает другую ссылку, которая может быть потеряна; во втором есть только одна ссылка, о которой нужно беспокоиться, который обычно хранится в локальном лексическом скаляре
  • , опосредованно манипулирующем переменными, например $$ foo , где $ foo изменен, что может вызвать автозапуск переменных (хотя вам нужно отключить строгая проверка «ссылок» )
4
ответ дан 27 November 2019 в 19:28
поделиться

Хорошее руководство по этому поводу включено в руководство Perl: Отладка использования памяти Perl

2
ответ дан 27 November 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: