Всем доброго!
Была некая прога, ещё из под Visual Studio 6.0 C++, мигрировал всё это дело на Visual Studio 2012...
Отлично работает под Windows7 x86 и Windows 8 x64, но после того как я её выложил на сервер Windows 2012 R2 x64 началась башенная утечка памяти! За несколько дне до 1гига... Кто сталкивался? Разъясните!!! Может в настройках какие-то дополнительные атрибуты выставить?
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, Pzz, Вы писали:
Pzz>>На любом из этих языков можно организовать утечку памяти. K>Хмм. Приведи утечку памяти, а не ресурса на Java.
1) память это ресурс.
2) выдели память системной функцией типа VirtualAlloc — получишь утечку.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, Kernan, Вы писали:
K>>Здравствуйте, Pzz, Вы писали:
Pzz>>>На любом из этих языков можно организовать утечку памяти. K>>Хмм. Приведи утечку памяти, а не ресурса на Java.
A>1) память это ресурс.
Это понятно. Я имел вииду какой-нибудь файл или соединение с базой... A>2) выдели память системной функцией типа VirtualAlloc — получишь утечку.
Где такое в Джава?
Здравствуйте, Аноним, Вы писали:
А>Всем доброго! А>Была некая прога, ещё из под Visual Studio 6.0 C++, мигрировал всё это дело на Visual Studio 2012... А>Отлично работает под Windows7 x86 и Windows 8 x64, но после того как я её выложил на сервер Windows 2012 R2 x64 началась башенная утечка памяти! За несколько дне до 1гига...
1. 1 Гиг — какой именно счетчик и где его брал ?
2. Проверялась ли работа программы под Windows 7 в течение нескольких дней ? Если нет, то почему уверен, что там нет утечки памяти ?
Никакие настройки тут не помогут. Надо искать утечки памяти в программе, судя по всему, там просто не освобождается выделяемая память.
Здравствуйте, Kernan, Вы писали:
K>Хмм. Приведи утечку памяти, а не ресурса на Java.
Элементарно — сделали временный объект, например, буффер членом класса. Или был объект членом класса, рефакторили, рефакторили, объект стал не нужен в классе, а удалить забыли.
Кроме того, когда у тебя приложение перестанет работать из-за того, что коннекшены к базе утекли, а не память, тебе от осознания этого легче не станет.
Здравствуйте, Kernan, Вы писали:
Pzz>>На любом из этих языков можно организовать утечку памяти. K>Хмм. Приведи утечку памяти, а не ресурса на Java.
Элементарно — подписка на событие которое не происходит, где handler держит ссылки на объекты. Другой вариант — положи что-нибудь в static переменную, и забудь вовремя отчистить.
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, Pzz, Вы писали:
Pzz>>На любом из этих языков можно организовать утечку памяти. K>Хмм. Приведи утечку памяти, а не ресурса на Java.
Забыл занулить ссылку. Забыл удалить из списка объект, который больше не нужен. По факту, в Java/С# утечку памяти организовать ещё проще, чем в С++. Потому что в С++
ты гарантировано убиваешь динамический объект вызовом delete, а в управляемых языках ты должен прибить все ссылки на объект.
Здравствуйте, Шахтер, Вы писали:
Ш>ты гарантировано убиваешь динамический объект вызовом delete,
Вот не факт. Например, можно вызвать delete вместо delete[] (в 99). Но это к слову. Ш>а в управляемых языках ты должен прибить все ссылки на объект.
Ну ты мне говоришь это с такой интонацией как будто я этого не знаю. Тезис был про утечку памяти. В моём понимании классическая утечка это именно С/C++-шная утечка памяти. То, что в джава течёт из-за забытых в тоннах говнокода ресурсах типа коннекшена к б/д или почивших в дедлоке ссылкок я в курсе.
Здравствуйте, Аноним, Вы писали:
А>Может в настройках какие-то дополнительные атрибуты выставить?
Программирование — это магия. Чтобы избавиться от бага, нужно в настройках волшебные атрибуты выставить, и дальше оно само!
Нужно смотреть, в чём разница между окружениями программы.
Может, на девелоперской тачке есть файлик tiny.txt размером 3 байта, а на сервере этот же файлик — 100-метровый. Десять раз загрузили его — вот и будет 30 байт против гектара.
Может, у программы есть мега-пул, который очищается при достижении определённого процента от количества доступной памяти. На девелоперской тачке это происходит раз в час, а на сервере — раз в неделю.
Кстати, запросто! Сильно фрагментированная куча. Менеджер кучи хапает и хапает страницы, формально они уже свободны, но он их держит про запас.
Может, какой-нибудь конфиг на девелоперской тачке содержит нормальные данные, а на сервере — мусор, к которому программа не готова. Или не мусор, а боевые значения, к которым программа не готова (например, ловит целочисленное переполнение и вместо 10 байтов выделяет 2**32+10, а потом освобождает только 10).
Слабо поставить на сервер дебажную сборку и удалённо поотлаживть?
12/11/2013 12:39 PM, Кодт пишет:
> Программирование — это магия. Чтобы избавиться от бага, нужно в > настройках волшебные атрибуты выставить, и дальше оно само!
+100500
> Слабо поставить на сервер дебажную сборку и удалённо поотлаживть?
Вообще-то это плохое решение. Это крайняя ситуация.
А так надо искать баги в программе, искать где и что утекает и когда и
почему и фиксить.
Да и в дебаге у него может не течь, а течь в релизе.
Я вам больше скажу, таких проги две (я имею ввиду которые мигрировали), и обе жрут как кони именно на винде 2012 х64... после примерно 1гига проги падают...
12/11/2013 3:07 PM, ronik пишет:
> Я вам больше скажу, таких проги две (я имею ввиду которые мигрировали), > и обе жрут как кони именно на винде 2012 х64... после примерно 1гига > проги падают...
В них баги. Это все, что можно тебе ответить и чем можно тебе помочь при
имеющемся объеме информации.
Здравствуйте, Vzhyk, Вы писали:
Спасибо! Усё понял, будем лечиться... V>12/11/2013 3:07 PM, ronik пишет:
>> Я вам больше скажу, таких проги две (я имею ввиду которые мигрировали), >> и обе жрут как кони именно на винде 2012 х64... после примерно 1гига >> проги падают... V>В них баги. Это все, что можно тебе ответить и чем можно тебе помочь при V>имеющемся объеме информации.
Здравствуйте, Vzhyk, Вы писали:
Спасибо! Усё понял, будем лечиться!!! V>12/11/2013 3:07 PM, ronik пишет:
>> Я вам больше скажу, таких проги две (я имею ввиду которые мигрировали), >> и обе жрут как кони именно на винде 2012 х64... после примерно 1гига >> проги падают... V>В них баги. Это все, что можно тебе ответить и чем можно тебе помочь при V>имеющемся объеме информации.
Здравствуйте, Kernan, Вы писали:
Ш>>а в управляемых языках ты должен прибить все ссылки на объект. K>Ну ты мне говоришь это с такой интонацией как будто я этого не знаю. Тезис был про утечку памяти. В моём понимании классическая утечка это именно С/C++-шная утечка памяти. То, что в джава течёт из-за забытых в тоннах говнокода ресурсах типа коннекшена к б/д или почивших в дедлоке ссылкок я в курсе.
Ну утечка это прежде всего нарушение баланса между выделением и освобождением.
Термин "классическая утечка" ни разу не встречал, но не вижу никакой разницы между забытым вызовом деструктора и забытым удалением ненужного обьекта из коллекции с временем жизни совпадающим с временем жизни всего приложения.
Если на С++ организовать подсчет ссылок или даже GC для определенных типов, а другие типы просто не использовать, то утечки останутся утечками.
Просто они будут возникать по причине невыполнения действий, отличных от вызова delete или деструктора