Найдено результатов: 22

Анатомия " утечки памяти"

В перспективе .NET:

  • Что такое утечка памяти ?
  • Как вы можете определить, утечка ли вашего приложения? Что же это за последствия?
  • Как можно предотвратить утечку памяти?
  • Если у вашего приложения есть утечка памяти, она исчезает при завершении процесса или убивается? Или утечки памяти в вашем приложении влияют на другие процессы в системе даже после завершения процесса?
  • А как насчет неуправляемого кода, доступ к которому осуществляется через COM Interop и / или P/Invoke?

.net   performance   memory-leaks   com-interop    

639   15   16:03, 1st July, 2020


Повреждение кучи под Win32; как найти?

Я работаю над многопоточным приложением C++, которое разрушает кучу. Обычные инструменты для обнаружения этого повреждения кажутся неприменимыми. Старые сборки (18 месяцев) исходного кода демонстрируют такое же поведение, как и самый последний релиз, поэтому это было сделано в течение длительного времени и просто не было замечено; с другой стороны, исходные дельты не могут быть использованы для определения того, когда была введена ошибка - в репозитории есть много изменений кода.

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

Такое поведение, по-видимому, связано с мощностью CPU или пропускной способностью памяти; чем больше у каждой машины есть, тем легче она падает. Отключение ядра hyper-threading core или двухъядерного ядра снижает скорость (но не устраняет) повреждения. Это наводит на мысль о проблеме, связанной со сроками.

А теперь вот в чем загвоздка:
Когда он выполняется в облегченной среде отладки (скажем, Visual Studio 98 / AKA MSVC6), повреждение кучи достаточно легко воспроизводится - проходит десять или пятнадцать минут, прежде чем что-то ужасно выходит из строя и возникают исключения, например alloc; при работе в сложной среде отладки (Rational Purify, VS2008/MSVC9 или даже Microsoft Application Verifier) . система становится привязанной к скорости памяти и не падает (привязка к памяти: CPU не становится выше 50% , индикатор диска не горит, программа работает так быстро, как может, коробка потребляет 1.3G из 2G RAM). Итак, у меня есть выбор между возможностью воспроизвести проблему (но не идентифицировать причину) или возможностью идентифицировать причину или проблему, которую я не могу воспроизвести.

Мои текущие лучшие догадки о том, куда идти дальше:

  1. Получите безумно грубый ящик (чтобы заменить текущий ящик dev: 2Gb RAM в E6550 Core2 Duo ); это позволит повторить сбой, вызывающий неправильное поведение при работе в мощной среде отладки; или
  2. Перепишите операторы new и delete , чтобы использовать VirtualAlloc и VirtualProtect для обозначения памяти как доступной только для чтения, как только это будет сделано. Бегите под MSVC6 и пусть OS поймает плохого парня, который пишет в освобожденную память. Да, это признак отчаяния: кто, черт возьми, переписывает new и delete ?! Интересно, будет ли это так же медленно, как в случае с Purify и др.

И нет: доставка с встроенным прибором Purify-это не вариант.

Коллега только что прошел мимо и спросил "Stack Overflow? Are we getting stack overflows now?!?"

А теперь вопрос: как мне найти корруптор кучи?


Обновление: балансировка new[] и delete[] , похоже, прошла долгий путь к решению этой проблемы. Вместо 15 минут приложение теперь работает примерно за два часа до сбоя. Но пока еще нет. Есть еще какие-нибудь предложения? Повреждение кучи сохраняется.

Обновление: сборка выпуска под Visual Studio 2008 кажется значительно лучше; текущие подозрения основываются на реализации STL , которая поставляется с VS98 .


  1. Воспроизвести проблему. Dr Watson создаст дамп, который может быть полезен в дальнейшем анализе.

Я приму это к сведению, но меня беспокоит, что доктор Уотсон будет спотыкаться только после того, как это произойдет, а не тогда, когда куча будет растоптана.

Другой попыткой может быть использование WinDebug в качестве инструмента отладки, который является довольно мощным и в то же время легким.

В данный момент это опять же происходит: не очень-то помогает, пока что-то не пойдет не так. Я хочу поймать вандала с поличным.

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

Я не питаю больших надежд, но отчаянные времена требуют этого...

И вы уверены , что все компоненты проекта имеют правильные настройки библиотеки времени выполнения ( C/C++ tab, категория генерации кода в настройках проекта VS 6.0)?

Нет, я не буду, и завтра я проведу пару часов, просматривая рабочее пространство (58 проектов в нем) и проверяя, что все они компилируются и связываются с соответствующими флагами.


Обновление: это заняло 30 секунд. Выберите все проекты в диалоговом окне Settings , снимите флажок, пока не найдете проекты, которые не имеют правильных настроек (все они имели правильные настройки).

c++   windows   multithreading   debugging   memory    

757   15   16:03, 1st July, 2020


Установка объектов на Null/Nothing после использования in .NET

Следует ли вам установить все объекты в null (Nothing в VB.NET), как только вы закончите с ними?

Я понимаю, что в .NET необходимо избавиться от любых экземпляров объектов, реализующих интерфейс IDisposable , чтобы освободить некоторые ресурсы, хотя объект все еще может быть чем-то после его удаления (отсюда свойство isDisposed в формах), поэтому я предполагаю, что он все еще может находиться в памяти или, по крайней мере, частично?

Я также знаю, что когда объект выходит из области видимости, он помечается для сбора, готового к следующему проходу сборщика мусора (хотя это может занять некоторое время).

Таким образом, имея это в виду, будет ли установка его в null ускорить систему освобождения памяти, как это не должно работать, что он больше не находится в области и есть ли какие-либо плохие побочные эффекты?

MSDN статьи НИКОГДА не делают этого в примерах, и в настоящее время я делаю это так, как не могу видишь, какой вред. Однако я столкнулся со смешением мнений, поэтому любые комментарии полезны.

c#   .net   vb.net   memory-management   null    

528   14   16:03, 1st July, 2020


Rational Purify не удается перейти к утечкам памяти

Поэтому моя компания использует восхитительно ошибочную программу Rational Purify (как плагин для Microsoft Visual Developer Studio) для управления утечками памяти. Программа соизволила позволить вам нажать на утечку памяти после того, как вы столкнулись с ней, а затем перейти к строке, на которой происходит утечка.

К сожалению, Purify неисправен, и Purify не будет прыгать в место, где произошла утечка, он только упоминает класс и метод, в котором происходит утечка. К сожалению, иногда это так же полезно, как нанять гида, чтобы помочь вам охотиться на медведей и заставить его указать на лес и сказать вам, что там есть медведи.

У кого-нибудь с опытом Purify есть идеи, как я могу исправить эту проблему или иметь хорошее руководство, чтобы посмотреть?

memory-leaks   purify    

461   5   16:03, 1st July, 2020


лучший способ сохранения данных в веб-службе .NET

У меня есть веб-служба, которая запрашивает данные из этого файла json, но я не хочу, чтобы веб-служба каждый раз обращалась к этому файлу. Я думаю, что, возможно, я могу хранить данные где-то еще (возможно, в памяти), чтобы веб-служба могла просто получить данные оттуда в следующий раз, когда она попытается запросить те же самые данные. Я вроде бы понимаю, что нужно сделать, но я просто не знаю, как это сделать на самом деле. Как мы сохраняем данные в веб-сервисе?

Обновление: оба предложения, кэширование и использование статических переменных, выглядят хорошо. Может быть, мне стоит использовать оба варианта, чтобы сначала посмотреть на один, а если его там нет, то использовать второй, если его там тоже нет, тогда я посмотрю на файл json.

.net   web-services   json   memory   persistence    

408   4   11:53, 19th August, 2020


Как избавиться от класса в .net?

Сборщик мусора .NET в конечном итоге освободит память, но что делать, если вы хотите, чтобы эта память немедленно вернулась? Какой код нужно использовать в классе MyClass для вызова

MyClass.Dispose()

и освободить все используемое пространство переменными и объектами в MyClass ?

.net   memory   dispose    

610   20   11:58, 15th August, 2020


Предотвращение утечек памяти с помощью прикрепленных моделей поведения

Я создал "attached behaviour" в своем приложении WPF, которое позволяет мне обрабатывать нажатие клавиши Enter и переходить к следующему элементу управления. Я называю его EnterKeyTraversal.IsEnabled, и вы можете увидеть код на моем блоге здесь .

Моя главная проблема сейчас заключается в том, что у меня может быть утечка памяти, так как я обрабатываю событие PreviewKeyDown на UIElements и никогда явно не "unhook" событие.

Как лучше всего предотвратить эту утечку (если она действительно существует)? Следует ли мне сохранить список элементов, которыми я управляю, и отцепить событие PreviewKeyDown в событии Application.Exit? Удалось ли кому-нибудь добиться успеха с привязанным поведением в своих собственных приложениях WPF и придумать элегантное решение для управления памятью?

.net   wpf   memory    

525   11   22:53, 27th August, 2020


Ошибка Visual Studio: неожиданно не удалось выполнить задачу "GenerateResource"

При построении решения VS 2008 с 19 проектами я иногда получаю:

The "GenerateResource" task failed unexpectedly.
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.IO.MemoryStream.set_Capacity(Int32 value)
   at System.IO.MemoryStream.EnsureCapacity(Int32 value)
   at System.IO.MemoryStream.WriteByte(Byte value)
   at System.IO.BinaryWriter.Write(Byte value)
   at System.Resources.ResourceWriter.Write7BitEncodedInt(BinaryWriter store, Int32 value)
   at System.Resources.ResourceWriter.Generate()
   at System.Resources.ResourceWriter.Dispose(Boolean disposing)
   at System.Resources.ResourceWriter.Close()
   at Microsoft.Build.Tasks.ProcessResourceFiles.WriteResources(IResourceWriter writer)
   at Microsoft.Build.Tasks.ProcessResourceFiles.WriteResources(String filename)
   at Microsoft.Build.Tasks.ProcessResourceFiles.ProcessFile(String inFile, String outFile)
   at Microsoft.Build.Tasks.ProcessResourceFiles.Run(TaskLoggingHelper log, ITaskItem[] assemblyFilesList, ArrayList inputs, ArrayList outputs, Boolean sourcePath, String language, String namespacename, String resourcesNamespace, String filename, String classname, Boolean publicClass)
   at Microsoft.Build.Tasks.GenerateResource.Execute()
   at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult)   C:\Windows\Microsoft.NET\Framework\v3.5

Обычно это происходит после того, как VS работает около 4 часов; единственный способ заставить VS правильно компилироваться-закрыть VS и запустить его снова.

Я на машине с 3 ГБ Ram. TaskManager показывает, что рабочий набор devenv.exe равен 578060K, а все выделение памяти для машины равно 1.78GB. У него должно быть более чем достаточно ram, чтобы генерировать ресурсы.

visual-studio   out-of-memory    

559   8   04:21, 18th August, 2020


Может ли использование лямбд в качестве обработчиков событий вызвать утечку памяти?

Скажем, у нас есть следующий метод:

private MyObject foo = new MyObject();

// and later in the class

public void PotentialMemoryLeaker(){
  int firedCount = 0;
  foo.AnEvent += (o,e) => { firedCount++;Console.Write(firedCount);};
  foo.MethodThatFiresAnEvent();
}

Если класс с этим методом создается экземпляр и метод PotentialMemoryLeaker вызывается несколько раз, происходит ли утечка памяти?

Есть ли какой-нибудь способ отцепить этот обработчик событий lambda после того, как мы закончим вызывать MethodThatFiresAnEvent ?

memory-leaks   lambda   event-handling    

453   5   01:32, 3rd August, 2020


Является ли визуальная память C++ управляемой платформой Dot Net

Недавно я столкнулся с ошибкой при доступе к MAPI через фреймворк .NET (как описано в этой статье). Теперь я остался с серией ошибок нарушения доступа к памяти.

Чтобы обойти эти проблемы, я пытался использовать этот сторонний компонент, который имеет ядро Visual C++. К сожалению, мы все еще имеем те же ошибки.

Я лично никогда не использовал Visual C++, но мой вопрос заключается в следующем: если библиотека C++ компилируется с помощью Visual Studio 2005, используя Visual C++ - будет ли память проекта управляться платформой .NET, а это, следовательно, сделает ее подверженной тем же проблемам, что и библиотеки .NET, которые мы используем? Или я лаю не на то дерево?

.net   visual-c++   memory    

392   3   01:57, 5th August, 2020


Огромное веб-приложение с утечкой памяти в IE 6

У меня есть огромное веб-приложение, которое имеет проблемы с утечкой памяти в IE 6.

Исправление утечки памяти в примере кода 5 строк, демонстрирующем проблему, легко.

Но если у меня есть очень большое приложение, с чего начать?

memory-leaks   internet-explorer-6    

512   4   04:54, 3rd August, 2020


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

Назовите все возможные способы, с помощью которых мы можем получить утечку памяти .NET?

Я знаю о двух из них:

  1. Неправильно не регистрируются обработчики/делегаты событий .
  2. Отказ от использования динамических дочерних элементов управления в формах Windows:

Пример:

// Causes Leaks  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  

// Correct Code  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  
label.Dispose();

Обновление: идея состоит в том, чтобы перечислить общие подводные камни, которые не слишком очевидны (например, выше). Обычно считается, что утечки памяти не являются большой проблемой из-за сборщика мусора. Не так, как это было раньше в C++.


Отличная дискуссия, ребята, но позвольте мне уточнить... по определению, если в .NET не осталось ссылки на объект, он будет в какой-то момент собран как мусор. Так что это не способ вызвать утечку памяти.

В управляемой среде я бы счел это утечкой памяти, если бы у вас была непреднамеренная ссылка на какой-либо объект, о котором вы не знаете (отсюда два примера в моем вопросе).

Итак, каковы различные возможные способы, которыми может произойти такая утечка памяти?

.net   optimization   memory-leaks    

473   14   09:49, 17th August, 2020


memset() причина прерывания передачи данных

Я получаю некоторые странные, прерывистые, прерывания данных (< 5% времени) в некоторых моих кодах, когда вызываю memset() . Проблема в том, что обычно это не происходит, если код не работает в течение нескольких дней, поэтому его трудно поймать в действии.

Я использую следующий код:

char *msg = (char*)malloc(sizeof(char)*2048);
char *temp = (char*)malloc(sizeof(char)*1024);
memset(msg, 0, 2048);
memset(temp, 0, 1024);
char *tempstr = (char*)malloc(sizeof(char)*128);

sprintf(temp, "%s %s/%s %s%s", EZMPPOST, EZMPTAG, EZMPVER, TYPETXT, EOL);
strcat(msg, temp);

//Add Data
memset(tempstr, '\0', 128);
wcstombs(tempstr, gdevID, wcslen(gdevID));
sprintf(temp, "%s: %s%s", "DeviceID", tempstr, EOL);
strcat(msg, temp);

Как вы можете видеть, я не пытаюсь использовать memset с размером больше, чем то, что изначально выделено с malloc()

Кто-нибудь видит, что может быть не так с этим?

c++   c   memory   windows-mobile    

451   10   10:28, 12th August, 2020


Компонент flvplayback проблемы с памятью

Мой сайт полностью основан на flash, он перемещается вокруг модели 3D, которая была предоставлена мне в виде фрагментов видео, которые я преобразовал в файлы FLV. Я использую компонент FLVPlayback для управления видео внутри моей программы. При выполнении проверок памяти с помощью System.totalMemory я заметил, что всякий раз, когда загружается видео, оно съедает кусок памяти, и даже когда я удаляю из него все прослушиватели событий(все они слабо связаны), удаляю компонент из его родительского элемента, останавливаю видео и null экземпляр компонента, он все равно не вернет эту память.

Это беспокоило меня с тех пор, как я начал работать над этим проектом из-за огромного количества видео, которое пользователь может потенциально создать и загрузить. В настоящее время каждое видео загружается в новый экземпляр FLVPlayback всякий раз, когда это требуется, но я прочитал, что, возможно, лучший способ решить эту проблему-просто иметь глобальный экземпляр FLVPlayback и просто перезагрузить новое видео в старый экземпляр, таким образом, в памяти приложения будет только один компонент FLVPlayback.

Кто-нибудь еще столкнулся с этой проблемой? Вы нашли лучшее решение, чем использование глобального экземпляра, который вы просто повторно используете для каждого нового видео?

actionscript-3   memory   video   flash    

464   5   02:37, 15th August, 2020


Как управляемая память .net обрабатывает типы значений внутри объектов?

public class MyClass
{
    public int Age;
    public int ID;
}

public void MyMethod() 
{
    MyClass m = new MyClass();
    int newID;
}

Насколько я понимаю, верно следующее:

  1. Ссылка m живет в стеке и выходит из области видимости при выходе MyMethod().
  2. Тип значения newID живет в стеке и выходит за пределы области действия при выходе MyMethod().
  3. Объект, созданный оператором new, живет в куче и становится возвращаемым GC, когда MyMethod() завершает работу, предполагая, что никакой другой ссылки на объект не существует.

Вот мой вопрос:

  1. Существуют ли типы значений внутри объектов в стеке или куче?
  2. Является ли бокс / распаковка типов значений в объекте проблемой?
  3. Есть ли какие-либо подробные, но понятные ресурсы по этой теме?

Логически я бы предположил, что типы значений внутри классов будут находиться в куче, но я не уверен, что они должны быть упакованы, чтобы попасть туда.

Редактировать:

Рекомендуемое чтение для этой темы:

  1. CLR через C# Джеффри Рихтер
  2. Важно .NET Дон коробки

.net   memory    

459   6   11:50, 4th August, 2020


C Управление Памятью

Я всегда слышал, что в C году вы должны действительно следить за тем, как вы управляете памятью. И я все еще начинаю учиться C, но до сих пор мне не приходилось делать никаких действий, связанных с управлением памятью.. Я всегда представлял себе, что мне придется освобождать переменные и делать всевозможные уродливые вещи. Но, похоже, это не так.

Может ли кто-нибудь показать мне (с примерами кода) пример того, когда вы должны были бы сделать некоторые "memory management" ?

c   memory    

407   12   08:12, 15th August, 2020


получить информацию о системе OS-го уровня

В настоящее время я создаю приложение Java, которое может работать на многих разных платформах, но в первую очередь на вариантах Solaris, Linux и Windows.

Удалось ли кому-нибудь успешно извлечь такую информацию, как текущее используемое дисковое пространство, использование CPU и память, используемая в базовом OS? А как насчет того, что потребляет само приложение Java?

Предпочтительно я хотел бы получить эту информацию без использования JNI.

java   memory   resources   system    

429   15   03:10, 8th August, 2020


Что является лучшим детектором утечки свободной памяти для программы C/C++ и ее плагина DLLs?

У меня есть .exe и много подключаемых модулей .dll, которые загружает .exe. (У меня есть источник для обоих.) Кросс-платформенное (с исходным кодом) решение было бы идеальным, но платформа может быть сужена до WinXP и Visual Studio (7.1/2003 в моем случае).

Встроенный детектор утечки VS дает только строку, из которой был вызван new/malloc, но у меня есть оболочка для распределения, поэтому лучше всего использовать полный символический стек trace.

Детектор также мог бы обнаружить утечку как в .exe, так и в сопутствующих ему подключаемых модулях .dll.

c++   c   visual-studio   memory-leaks    

472   7   21:40, 2nd August, 2020


Как происходит "stack overflow" и как вы его предотвращаете?

Как происходит переполнение стека и каковы наилучшие способы убедиться, что это не произойдет, или способы предотвратить его, особенно на веб-серверах, но другие примеры также были бы интересны?

memory   stack-overflow    

786   9   14:11, 23rd August, 2020


Использование MySQLi-что лучше для закрытия запросов

У меня есть привычка сводить использование переменных к минимуму. Поэтому мне интересно, есть ли какое-либо преимущество, которое можно получить следующим образом:

$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');

// Example 1
$query = $query->fetch_assoc();

// Example 2
$query_r = $query->fetch_assoc();
$query->free();

Теперь, если я прав, Пример 1 должен быть более эффективным, поскольку $query - это unset , когда я переназначаю его, что должно освободить любую память, связанную с ним. Однако есть метод (MySQLi_Result::free()), который освобождает ассоциированную память - это одно и то же?

Если я не вызываю ::free() , чтобы освободить память, связанную с результатом, но unset , переназначив переменную, я делаю то же самое? Я не знаю, как регистрировать такие вещи - у кого-нибудь есть идеи?

php   mysql   memory   mysqli    

474   2   07:27, 18th August, 2020


C++ управление памятью

Я узнал в колледже, что вы всегда должны освободить свои неиспользуемые объекты, но не то, как вы это делаете на самом деле. Например, правильно структурировать код и так далее. Существуют ли какие-либо общие правила о том, как обрабатывать указатели в C++?

В настоящее время мне запрещено использовать boost. Я должен придерживаться чистого c++, потому что фреймворк, который я использую, запрещает любое использование дженериков.

c++   memory   pointers    

390   8   14:15, 8th August, 2020


Поиск файлов аварийного дампа для приложения C#

Приложение, которое я пишу, всегда аварийно завершает работу на клиентском компьютере, но я не получаю описания исключений или стека trace.
Единственное, что я получаю, - это отчет о сбое, который windows хочет отправить в Microsoft.
Я хотел бы получить этот файл дампа и исследовать его сам, но я не могу найти его.

Когда я "View the contents of the error report", я могу видеть различные дампы памяти, но я не могу скопировать или сохранить его.

c#   crash   memory-dump    

428   2   00:34, 15th August, 2020