Высвобождение памяти через сборщик мусора

Автор Тема: Высвобождение памяти через сборщик мусора  (Прочитано 5412 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Ребята, подскажите, что делаю не так?
Сделал класс Test_Entity, для того чтобы создать
динамически коллекцию примитивов.
Код - C# [Выбрать]
  1.  
  2. namespace psm_cfunc {
  3.    public class Test_Entity {
  4.         public List<Entity> Ents; // Список отрезков
  5.         // Создание набора отрезков
  6.         public void test_create_lines() {
  7.             Ents = new List<Entity>();
  8.             int NE = 100000;
  9.             for (int i = 0; i < NE; i++)
  10.                 this.Ents.Add(new Line(new Point3d(0, 0, 0),
  11.                                        new Point3d(1, 1, 0)));
  12.         }
  13.         ~Test_Entity() {
  14.             for (int i = 0; i < Ents.Count(); i++) // наверное этот цикл вообще лишний???
  15.                this.Ents[i] = null;
  16.             this.Ents.Clear();
  17.             this.Ents = null;  
  18.         }
  19.     }
  20. // Два тестовых метода для создания и уничтожения объектов.
  21. public class c_psm_functions {
  22. // объект класса объявлен глобально.
  23. public static Test_Entity TE = new Test_Entity();
  24.         public static void Createlines()
  25.         {
  26.             TE.test_create_lines();
  27.         }
  28.         public static void Freelines()
  29.         {
  30.             TE = null;
  31.             // Вызов сборщика мусора
  32.             GC.WaitForPendingFinalizers();
  33.             GC.Collect();
  34.         }
  35. } // End class c_psm_functions
  36. } // End namespace
  37.  
  38.  


Получается следующее:
1) Сначала AutoCAD 2012 в ОЗУ занимает 77М
2) После создание набора отрезков  177М
3) После высвобождения и очистки коллекции 120 М (Почему память не вернулась хотя бы к 80М?)
Получается я взял 100М а вернул только 50М

 
Вызов методов делаю в проекте на VB

Код - vb.net [Выбрать]
  1. Imports CAD_RTM = Autodesk.AutoCAD.Runtime
  2.        <CAD_RTM.CommandMethod("PSM_CL")> _
  3.         Public Sub COMM_CreateL()
  4.             psm_cfunc.c_psm_functions.Createlines()
  5.         End Sub
  6.  
  7.         <CAD_RTM.CommandMethod("PSM_FL")> _
  8.         Public Sub COMM_FreeL()
  9.             psm_cfunc.c_psm_functions.Freelines()
  10.         End Sub

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Проделал эксперимент несколько раз
Занимаемая ОЗУ повышается и и снижается при соотв. вызовах методов.
При освобождении ОЗУ остается по разному:
119, 104, 108, 114 МБ где-то в этих пределах.
с погрешностью плюс минус 5М.

Но к первоначальным 77М не возвращается.

Попробовал создать не 100 000 отрезков а только 1 отрезок.
ОЗУ выросла на только 13М.

Может это связанно с тем, что моя подгружаемая dll
содержит много других функций и глобальных определений.
И вполне может выбрать 13М ОЗУ.
Попробую сделать на "чистом проекте с нуля".

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
А зачем Вам это? .NET код не зря зовется "управляемым", CLR отслеживает все объекты и выполняет очистку памяти: https://msdn.microsoft.com/ru-ru/library/0xy59wtx(v=vs.110).aspx. Неужели, эти "плюс 30 Мб" играют важную роль, при современных размерах ОЗУ не менее 8Гб для рабочей станции под AutoCAD?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
думаю это Acad подгружает свои библиотеки

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Некоторая часть памяти остается скорее из-за того что
сборщик мусора оставляет "пустые" участки памяти в куче.
И когда произойдет следующая дефрагментация наверное
одному только "сборщику мусора" известно.

Свои заключения я делаю на основе вот этого видео о сборщике мусора.