Можно ли освободить «несвязанную» память в QNX - PullRequest
0 голосов
/ 03 февраля 2020

Я занимаюсь разработкой программы, которая занимается графическим рендерингом. Я использую третий. сторонняя библиотека для рендеринга, поэтому все, что я делаю, - это создаю объекты и запрашиваю их рендеринг из библиотеки. Загрузка и освобождение ресурсов, таких как текстуры и шрифты, осуществляется этой библиотекой. Моя программа работает на QNX 7.

Моя проблема в том, что после того, как я запустил программу в течение некоторого времени (что не так много), я вижу, что память, используемая процессом, растет довольно быстро, что не в порядке. В моей программе я много изменяю графический контент, что заставляет программу загружать новые изображения и шрифты и выгружать те, которые не используются в настоящее время. Вся эта обработка выполняется кодом из сторонней библиотеки, и я могу поместить свой собственный код, чтобы убедиться, что выделенная память освобождена - у библиотеки, о которой я говорю, есть методы, которые отображают, сколько используется памяти ЦП и GPU, а также методы для освобождения памяти. Я могу отобразить текущую используемую память, вызвать метод, чтобы освободить память, а затем снова распечатать использованную память. Я вижу, что использованная память упала, чего я и ожидаю.

Я использую команду pidin mem для отображения используемой памяти каждого процесса. Я могу видеть, что мой процесс очищает память, когда я вызываю 3-й. функция партийной библиотеки. Тем не менее, он не может очистить достаточно памяти.

То, что я увидел в выводе pidin mem , это множество блоков, которые называются "** unlinked **". Ниже приведена часть вывода, который я получил из pidin :

163879   1 MyGraphApp  12r SIGWAITINFO         0  175M   32K(516K)*
           libm.so.3          @ b52a000              96K  4096
           libstdc++.so.6     @ b544000            1044K  4096
           libsocket.so.3     @ b716000             124K  4096
           **unlinked**       @24d90000 (       0)       2048K
           **unlinked**       @24f90000 (       0)        128K
           **unlinked**       @24fb0000 (       0)        128K
           **unlinked**       @24fd0000 (  210000)         64K
           **unlinked**       @24fe0000 (       0)        128K
           **unlinked**       @25000000 (       0)        128K
           **unlinked**       @25020000 (  21f000)        4096
           **unlinked**       @25021000 (  21f000)         36K
           **unlinked**       @2502a000 (       0)       5400K
           **unlinked**       @25570000 (  235000)       6164K
           **unlinked**       @25b75000 (  227000)         28K
           **unlinked**       @25b7c000 (  22d000)        8192
           **unlinked**       @25b7e000 (       0)        128K
           **unlinked**       @25b9e000 (       0)        128K
           **unlinked**       @25bbe000 (  840000)         60K
           **unlinked**       @25bcd000 (  22e000)        4096
           **unlinked**       @25bce000 (  850000)       5804K
           **unlinked**       @26179000 (  22e000)         28K

Как вы можете видеть, мое приложение использует 175 МБ памяти. Когда я запускаю приложение в начале, эта память меньше 100 МБ. Я вижу, что единственная часть, которая растет, это эти "** несвязанные **" блоки.

Что это за "** несвязанная **" память? Насколько я понимаю, это память, которая была освобождена, но не возвращена в ОС. Верно ли мое понимание?

Самое главное - можно ли освободить память, помеченную как "** unlinked **"? Кто несет ответственность за это - мое приложение и, возможно, код из сторонней библиотеки или самой ОС? Любая информация, касающаяся этой проблемы и как она может быть исправлена, будет высоко оценена.

PS: Я хочу упомянуть, что третье. Библиотека Party и мое приложение разработаны с использованием C ++.

С наилучшими пожеланиями

1 Ответ

1 голос
/ 05 февраля 2020

Отсутствие связи означает, что он больше не доступен для открытия по имени с помощью shm_open. Однако любые отображения памяти (mmap) или файловые дескрипторы (shm_open), которые все еще существуют в отношении этого объекта, будут препятствовать его фактическому освобождению.

...