Не вывозят мусор, куда жаловаться? Онлайн-жалоба на невывоз мусора
Итак, если не вывозят мусор, куда жаловаться? Контролирующих органов много, ниже будет приведен наиболее эффективный вариант. Но перед тем, как жаловаться, потребитель должен уточнить установленную периодичность вывоза в его регионе и убедиться, что они нарушены оператором.
Содержание статьи
Как часто должны вывозить мусор?
Коммунальщики могут ссылаться на нормы 80-х годов, согласно которым вывоз мусора должен совершаться не реже двух раз в неделю. Но это не так.Когда баки переполнены и отходы вываливаются наружу, возмущение жильцов понятно. Причины могут заключаться не только в плохой работе регионального оператора ТКО. К чрезмерному накоплению твердых коммунальных отходов (ТКО) приводит, в том числе, невыполнение своих обязанностей коммунальными службами, а также некорректности схем размещения мест для сора мусора.
За содержание контейнерных площадок для сбора мусора отвечают управляющая компания, жилищный кооператив или товарищество собственников жилья.
Для справки!
Не сложно разобраться, что вывоз ТКО происходит не часто. Если автомобиль для сбора и вывоза мусора приезжает один раз в 4-7 дней, то это неправильно. В таких случаях жильцы справедливо могут обратиться к региональному оператору с жалобой. Ответ может озадачить, в нем руководство организации может ссылаться на нормы еще второй половины 80-х годов прошлого столетия, по которым действительно предусматривался вывоз ТКО не реже двух раз в неделю.
Эти нормы были дублированы позже, в нулевых годах, Правительствами регионов. Таким образом, нормативная база, которой руководствуются операторы при таком нечастом вывозе ТКО, у них есть.
Когда на самом деле должны вывозить мусор и по каким дням?
Теперь мусор должен вывозиться 1 раз в сутки летом и 1 раз в 3 дня зимой.На данный момент операторы в организации обращения мусора должны руководствоваться нормами Закона об отходах производства и потребления (№89-ФЗ). В соответствии с его нормами:
- Обращение отходов организуется при соблюдении норм действующего законодательства;
- Договор на вывоз ТКО, который заключается с населением, должен соответствовать типовому соглашению, утверждаемому федеральным правительством;
- Дополнения в этот договор можно включать лишь по соглашению обеих сторон – оператора и потребителя.
Типовое соглашение, утвержденное в ноябре 2016 года (Постановление №1156) предусматривает, что периодичность вывоза ТКО устанавливается в приложении к этому договору (п.2). То есть, теоретически оператор мог навязать потребителям выгодную ему периодичность забора мусора.
Однако, Законодателем предусмотрены Санитарные правила содержания территорий населенных мест (42-128-4690-88). В них указано, что временное хранение мусора во дворах не должен приводить к его разложению, загниванию (п.2.2.1). Этим документом установлена периодичность вывоза мусора с контейнерных площадок:
- В холодное время года при температуре до +5оC – не реже одного раза в трое суток;
- В теплое время года при температуре свыше +5оC – не реже одного раза в сутки.
За обустройство контейнерных площадок для мусора, чистоту вокруг них отвечают коммунальные службы. Для справки!
То есть, операторы ограничены этими нормами, превышать их не имеют права. Но необходимо учитывать и то, что местные Санэпидемслужбы каждого города могут корректировать эти нормы, чтобы пресекалась антисанитария в местах сбора ТКО. В результате региональные правительства могут выдавать постановления, в которых вывоз мусора в любое время года проводится ежедневно.
А если потребуют дополнительную плату?
Такое требование регионального оператора незаконно.Оператор может ссылаться на дополнительные расходы, связанные с транспортировкой, но потребитель за нее не платит. Стоимость услуг на вывоз мусора:
- Указывается в типовом соглашении;
- Не может превышать размера единого тарифа.
Единый тариф на услуги регионального оператора утверждается местными органами власти в установленном порядке. Для справки!
Превысить размер единого тарифа региональный оператор не имеет права. В этом случае можно смело подавать жалобы в контролирующие органы.
Жалоба на невывоз мусора онлайн в РЭО
Официальный сайт РЭО-радара — https://radar.reo.ruИтак, поводы для жалоб у населения на регионального оператора сводятся к следующему:
- Мусор не вывозят, а квитанции приходят;
- Переполненные мусорные баки.
Чтобы быстро решить проблему, рекомендуется подать заявление Российскому экологическому оператору. Это публично-правовая компания (ППК), которая начала работу с апреля 2019 года. Ее задача – контроль за эффективным и законным обращением ТКО в стране.
Направить жалобу просто. Вместо того, чтобы направлять письма с заявлениями, можно зайти на официальный сайт ППК в раздел «РЭО радар».
Жалоба на невывоз мусора онлайн — Шаг 1.И нажать на кнопку «сообщить о нарушении».
Жалоба на невывоз мусора онлайн — Шаг 2.После этого пользователь переводится на страницу, в которой будет представлен список нарушений:
- Стихийная свалка;
- Нарушение сбора мусора;
- Сброс отходов I класса опасности;
- Сброс опасных отходов;
- Противозаконная утилизация;
- Нарушение деятельности полигонов ТБО;
- Неприятный запах;
- Отсутствуют контейнеры для раздельного сбора мусора.
В рассматриваемом случае нужно выбрать «нарушение сбора мусора». Пользователю раскроется абзац, в котором вкратце объясняется, что понимается под этим нарушением.
Ознакомившись, нужно нажать кнопку «выбрать причину».
Жалоба на невывоз мусора онлайн — Шаг 4.Пользователь попадает на страницу, на которой необходимо заполнить некоторые формы, а именно:
- точный адрес;
- описание проблемы;
- электронную почту;
- пароль для регистрации.
Рекомендуется предварительно заснять ситуацию с не вывозом мусора (желательно по дням) на цифровой фотоаппарат или смартфон. Фотографии загружаются в специальную форму. Это позволяет предоставить в ППК РЭО наглядное свидетельство нарушения.
Жалоба на невывоз мусора онлайн — Шаг 5.После отправки жалобы Российский экологический оператор обещает исправить ситуацию в течение 30 дней.
Жалоба на невывоз мусора онлайн — Шаг 6.Кто должен вывозить крупногабаритный мусор от населения?
Но некоторые вопросы могут оказаться спорными. Например, жалоба на отказ в вывозе определенных видов отходов. Так, существуют заблуждения, кто должен вывозить крупногабаритный мусор от населения. По закону, обращение таких отходов не предусмотрено типовым договором, потребителю необходимо заключать дополнительное соглашение с оператором.
Заключение
Можно пожаловаться и в другие инстанции за то, что не вывозят мусор. Однако на данный момент поданная заявка в ППК РЭО — наиболее эффективный и простой способ, который не нуждается в каких-либо затратах. Направить жалобу можно в течение нескольких минут, используя планшет, смартфон или ноутбук.
Владимирская прокуратура обвинила «Хартию» в выставлении счетов за мусор там, где отходы не вывозились. Мусорный оператор заявил, что это ошибка сборщика платежей
Во Владимирской области прокурорская проверка выявила необоснованное начисление платежей за вывоз мусора в ряде сельских населенных пунктов Александровского района. Региональный оператор по обращению с отходами недоумевает, почему оперативно исправленная ошибка фигурирует в прокурорском отчете
Александровской городской прокуратурой в октябре-ноябре 2020 года проведена проверка исполнения требований законодательства в сфере обращения с отходами. Как сообщила прокуратура Владимирской области, в ряде населенных пунктов владимирский филиал компании «Хартия», являющийся региональным оператором по Александровскому, Петушинскому и Кольчугинскому районам, начислил плату за вывоз мусора в нескольких деревнях, где по факту отходы не вывозились:
«Выявлены факты начисления региональным оператором платы за сбор и вывоз твердых коммунальных отходов на территории ряда населенных пунктов сельских поселений в отсутствии фактического предоставления такой коммунальной услуги; непринятия своевременных мер к произведению перерасчета платы ввиду ее необоснованного начисления».
Сообщается, что по этому поводу прокуроры внесли представление директору филиала «Владимирский» ООО «Хартия». Акт прокурорского реагирования находится на рассмотрении руководства компании.
Новость о взимании платы за невывоз мусора регоператором, которого экоактивисты неоднократно обвиняли в завозе на территорию Владимирской области отходов из Москвы, вызвала резонанс. Зебра ТВ обратилась с запросом во владимирское представительство «Хартии» — как так вышло, что селяне получили квитки за услугу, которая не была оказана.
По версии регионального оператора, августовские счета за вывоз мусора ошибочно выставил жителям сельской местности в Александровском районе платежный агент по сбору платы за ТКО — компания «Энергосбыт Волга». «Хартия» говорит, что после появления первых жалоб людям был сделан перерасчет — лишнюю строчку в квитанциях убрали. Об этом своевременно была уведомлена прокуратура. В «Хартии» недоумевают, почему в прокурорском отчете фигурирует формулировка «неприятие своевременных мер».
«В Александровском районе из-за ошибки нового платежного агента жителям нескольких населенных пунктов прислали квитанции на оплату услуги по вывозу мусора (ТКО) за август 2020 года, при этом непосредственная услуга по вывозу мусора региональным оператором в этих населенных пунктах не оказывалась. Как только региональному оператору поступили первые жалобы со стороны жителей данных населенных пунктов, все начисления были сняты и откорректированы по всем жителям, которым были направлены квитанции на оплату услуги.
По данному факту со стороны прокуратуры Александровского района была проведена проверка, по итогам которой в адрес регионального оператора в октябре 2020 года было направлено представление на устранение указанного нарушения. В связи с тем, что к моменту проведения проверки все корректировки по начислениям были проведены, необходимости в проведении дополнительных мер по устранению причины данной ситуации не понадобилось. Что и было указано представителями регионального оператора в ответе на представление прокуратуры района.
В связи с чем региональный оператор считает некорректной информацию, которая была размещена на сайте областной прокуратуры « о непринятия своевременных мер к произведению перерасчета платы ввиду ее необоснованного начисления» в новостном блоке», — говорится в ответе «Хартии» на запрос редакции.
Отметим, что прокурорская проверка выявила в Александровском районе не только необоснованное начисление жителям платы за вывоз мусора, но и недостатки в работе органов местного самоуправления сельских поселений по организации мест накопления твердых коммунальных отходов.
Надзорное ведомство установило, что в ряде населенных пунктов Каринского, Следневского, Андреевского и Краснопламенского сельских поселений площадки, куда жители должны приносить свои отходы, либо не созданы либо не соответствуют предъявляемым требованиям действующего законодательства — отсутствие ограждения, твердого покрытия и так далее. Отметим, что создание мест накопления отходов — это задача органов местного самоуправления.
Главам администраций сельских поселений внесены прокурорские представления, которые удовлетворены, местные власти приняли меры к устранению нарушений. Вопрос окончательного устранения нарушений находится на контроле в прокуратуре.
Самые яркие события дня — в инстаграме Зебра ТВ.
СНТ будут штрафовать за невывоз мусора
Садовые товарищества, не заключившие договоры о вывозе бытовых отходов, будут привлекать к административной ответственности. Изменения в областное законодательство и взаимодействие местных властей с СНТ обсуждали в минувшую пятницу на совещании с сити-менеджерами поселений Сергиево-Посадского района.
«Мы достаточно плотную и большую работу провели с апреля по очистке дворов, городских территорий, но в СНТ мусор вывозится плохо», – отметил замглавы района Дмитрий Акулов. Изменения в областном законодательстве, вступившие в силу с 1 июля, обязуют садовые товарищества заключать договоры на вывоз мусора с организациями, имеющими соответствующую лицензию, и с учетом норм накопления твердых бытовых отходов. В противном случае будут применяться нормы административной ответственности.
Администрации поселений систематически проводят встречи с председателями СНТ, где доносится информация об изменениях и требованиях законодательства, однако мусор вывозится далеко не везде. По озвученной информации, на сегодня договоры есть только у 30% садовых товариществ, причем не все реально исполняются.
«Необходимо быть готовыми рассказать СНТ о новых поручениях и изменениях, проанализировать имеющие договоры, переписать их в соответствии с типовым договором. Не все, что обсуждалось на прошлых собраниях, уже соответствует действительности. Прошу организовать в своих поселениях повторные совещания», – обратился к сити-менеджерам начальник районного управления транспорта, связи и дорожной деятельности Андрей Досавицкий.
Он рекомендовал привлечь к контролю над исполнением законодательства в плане вывоза мусора внештатных контролеров. На территории Сергиево-Посадского района около 600 садовых товариществ, и силами надзорных органов охватить их все непросто. «Это не обязательно должны быть муниципальные работники. У нас масса активных граждан, которые постоянно пишут жалобы, и теперь могли бы приносить реальную пользу», – добавил Андрей Досавицкий.
Единая пресс-служба
В Казани на майские праздники начал скапливаться мусор — Реальное время
Жители нескольких районов Казани стали жаловаться на невывоз мусора в период майских праздников. Мэр столицы Татарстана Ильсур Метшин призвал регионального оператора, который отвечает за вывоз мусора, усилить работу и взяться за исполнение своих обязанностей с большей ответственностью.
Фото: kzn.ruТак, в поселке Алтан Приволжского района буквально за сутки образовалась гора мусора из бытовых отходов, веток, листвы. Два бункера для сбора бытовых отходов переполнились, мешки валялись на земле.
Генеральный директор регионального оператора, который отвечает за вывоз мусора с территории Казани и западной зоны Татарстана, ООО «УК «ПЖКХ» Сергей Богатов объяснил, что в этом году твердых коммунальных отходов в два—три раза больше, поскольку в прошлом году из-за пандемии многие не участвовали в субботниках. Также сейчас очень много людей отдыхают на дачах. Компания вывозит мусор ежедневно.
Фото: kzn.ruГлава Вахитовского и Приволжского районов Марат Закиров сообщил, что ситуация с поселками находится на постоянном контроле, и переполненные мусором бункеры — это единичные случаи. Основная проблема — это плотная застройка. На большое количество домов приходится лишь одна контейнерная площадка. Метшин в качестве альтернативы предложил внедрить мешочный сбор мусора. Такая практика уже применяется в девять из 97 поселков Казани. По улицам частного сектора будет ездить мусороуборочная машина и забирать пакеты с мусором у каждого дома.
Непростая ситуация наблюдается и в поселках Вишневка и Привольный. По словам председателя ТОС Марата Вагизова, здесь мусор складируют по 5 тыс. домов ежедневно. А некоторые жители выбрасывают строительные отходы в бункеры, предназначенные для бытовых. Мэр города поручил установить камеры видеонаблюдения для фиксации нарушителей.
Руководителю регионального оператора — ООО «УК «ПЖКХ» поручили в кратчайшие сроки нормализовать ситуацию во всех поселках. По данным компании, в поселке Алтан мусорные горы уже убраны, сообщается на сайте мэрии столицы РТ.
В конце апреля в соцсетях пользователи сообщили, что после субботника в казанском поселке Салмачи образовалась большая свалка мусора возле контейнеров.
куда жаловаться, звонить, к кому обращаться за помощью
Многим жильцам многоквартирных домов нередко приходится сталкиваться с проблемами несвоевременного вывоза бытовых отходов, когда мусором переполнены не только контейнеры, но и площадки, на которых они размещены. В то время, как стоимость коммунальных услуг периодически повышается, организации, ответственные за утилизацию ТБО не всегда выполняют свои обязанности качественно и в срок. В таких случаях необходимо как можно скорее обращаться с жалобой в управляющую компанию или ЖКХ.
Содержание статьи
Не вывозят мусор — последствия скопления отходов
Несвоевременный вывоз, неправильный сбор и утилизация коммунальных отходов в частном секторе и дворах многоэтажных домов угрожает окружающей среде и здоровью. Токсичные вещества, которые содержатся в мусоре, загрязняют землю и воздух, проникают в воду и вызывают заражения различными заболеваниями. Также места скопления отходов становятся рассадниками вредителей и насекомых. На контейнерных площадках собираются бродячие животные и грызуны.
Кто несет ответственность за своевременную уборку ТКО
За правильный сбор, своевременный вывоз и утилизацию ТКО несет ответственность региональный оператор и управляющая компания, с которой заключается договор на предоставление услуг. Плата за эти услуги включена в коммунальные платежи. Согласно Постановлению Правительства РФ от 03.04.2013 № 290, п. 26.1, ТСЖ и УК также несет ответственность за правильное обустройство и обслуживание территории для сбора бытовых отходов, а также за содержание в чистоте и исправность мусоропроводов.
Если возник вопрос о том, куда жаловаться на вывоз мусора или если поставщик услуг не выполняет свои обязанности, отходы вывозятся не по графику или отсутствует предписанная в договоре сортировка отходов, жильцы могут подать на организацию жалобу в ЖКХ или городскую администрацию.
ФЗ о регламенте на вывоз отходов производства и потребления
Правила сбора и утилизации ТБО регламентируются согласно закону «Об отходах производства и потребления» № 89-ФЗ от 24.06.1998 г.
Законодательством предусмотрены правила установки контейнеров и обустройства контейнерных площадок. Если в многоквартирном доме проживает менее двух сотен человек, допускаются контейнеры емкостью 100 л. Для большего количества жильцов — 800 л. При этом общее количество контейнеров не должно превышать 4-5.
Внимание! Согласно СанПиН 42-128-4690-88 от 05.08.1988, утвержденному Минздравом СССР, площадки для размещения контейнеров должны асфальтироваться, установка ближе, чем на 20 метров от жилого дома запрещена. В теплое время года ТБО должны вывозиться ежедневно, при температуре ниже -5 градусов по Цельсию — раз в три дня.
Куда звонить за невывоз мусора
Прежде чем направлять в администрацию или Роспотребнадзор письменную жалобу, можно связаться по телефону с управляющей компанией, региональным оператором или департаментом ЖКХ. Звонок не поможет решить систематические невыполнения предписанных норм по сбору и вывозу отходов, но с его помощью можно получить подробную консультацию насчет письменного обращения в вышестоящие органы и обратить внимание региональных служб на факт нарушения.
Региональному оператору
Согласно законодательству РФ, за сбор, хранение и утилизацию отходов на определенной территории отвечает региональный оператор. В его обязанности входит надзор за регулярностью сбора и вывоза мусора, его правильным хранением и сортировкой.
В случае бездействия можно подать в Роспотребнадзор жалобу на регионального оператора по поводу вывоза мусора. Ответственность в случае несоблюдения предписанных законом норм, неправильного размещения и количества контейнеров предусмотрена статьей 8.2 КоАП РФ.
В управляющую компанию
Управляющая компания занимается обеспечением всех необходимых условий для правильного сбора, хранения и вывоза бытовых отходов. В обязанности УК входит заключение договора с региональным оператором и соблюдение всех предписанных обязательств по утилизации отходов.
Данные для связи с управляющей компанией, включая номера телефонов, электронную почту, сайт и адрес, указаны на платежных документах. Если претензию по телефону приняли, но меры по устранению проблемы не производятся более чем 3-5 дней, следует незамедлительно обращаться с письменным заявлением в другие организации по урегулированию коммунальных нарушений.
Представителю ТСЖ или ЖК
Также можно обратиться по телефону с жалобой к работникам ЖКХ и ТСЖ. Это одно из главных мест, куда можно жаловаться на невывоз мусора. Для этого нужно позвонить по номеру, который указан на квитанциях об оплате коммунальных услуг. В случае, когда жалоба долго остается без внимания, необходимо направиться с прошением о рассмотрении проблемы в городскую или районную администрацию.
Местное представительство Роспотребнадзора
Обратиться за помощью в случае несвоевременного вывоза ТБО можно также в местное отделение Роспотребнадзора. Эта организация осуществляет эпидемиологический, санитарный и медицинский контроль, в том числе и следит за чистотой на территории жилых кварталов. Обратиться с прошением можно по общему для всех регионов номеру горячей линии 8800 или позвонить в круглосуточный единый центр консультаций по телефону 88005554943.
По общим вопросам касательно сбора и вывоза можно бесплатно обратиться в справочную службу центрального аппарата по телефону 88001000004. Звонить можно из любого региона страны по будням с 10:00 до 17:00 по Москве, кроме времени перерыва с 12:00 до 12:45.
Если не вывозят мусор, куда жаловаться в письменном виде (контролирующие органы)
Чтобы задокументировать факт нарушения предписанных правил по сбору и вывозу мусора, можно также подать личную или коллективную письменную жалобу в один из ответственных органов власти. Кроме нерегулярного вывоза, жалобу также можно подать в случае нарушения раздельного сбора отходов, когда мусор из раздельных контейнеров работники сваливают в один бак или кузов. В таком случае ответственность за оператором предусмотрена Постановлением Правительства РФ от 18.11.2013 №1039 в редакции от 15.08.2019, тем более, если в тариф включена стоимость за сортировку отходов.
Важно! Письменную претензию лучше составлять коллективно. Как правило, на групповые обращения администрации ответственных служб реагируют быстрее и рассматривают в первую очередь.
К содержанию прошения нет жестких юридических требований, писать ее можно в свободной форме. В тексте прошения должна содержаться следующая информация:
- наименование организации, к которой направлена жалоба;
- данные заявителей (если их несколько) с указанием адреса дома, номерами квартир и паспортными данными;
- четко сформулированная суть проблемы;
- фото в качестве доказательства нарушения;
- подписи всех заявителей и дату составления.
К жалобе следует приложить второй экземпляр письма с датой подачи, подписью и печатью должностного лица.
Министерство ЖКХ
Департамент ЖКХ действует в каждом регионе и относится к органам исполнительной власти. Его основная задача — поддержание правильного функционирования жилищно-коммунальных служб, прием и обработка заявлений жильцов, в том числе и в случае не вывоза мусора и бытовых отходов. Пожаловаться в организацию можно несколькими способами:
- заполнить форму на электронном правительственном портале;
- послать жалобу на эмейл организации;
- отправить письмо, воспользовавшись услугами почты России;
- записаться на прием к руководителю или ответственному лицу, имея при себе готовый экземпляр прошения.
Обратите внимание! Для скорейшего рассмотрения жалобы стоит прикрепить к тексту заранее сделанные фотографии, которые доказывают факт нарушения со стороны компании.
Жилищная инспекция
Жилищная инспекция — это специальный управленческий орган, который решает проблемы в работе коммунальных служб и куда можно жаловаться, если не вывозят мусор. Организация принимает жалобы от всех граждан, в письменном или электронном виде. Также возможна личная или коллективная встреча с ответственным сотрудником.
После подачи и регистрации заявления уполномоченное лицо встречается по указанному в тексте жалобы адресу с жильцами дома и коммунальными работниками для составления протокола. Далее фиксируется факт правонарушения, выдвигаются сроки для его устранения и накладываются санкции в случае невыполнения предписанного распоряжения.
Роспотребнадзор
Когда региональный оператор и управляющая компания оставляет претензии без ответа, а невывоз мусора продолжается, необходимо обратиться с жалобой в Роспотребнадзор. Письменное обращение стоит подавать лично, посетив региональное отделение службы. Можно также подать прошение о рассмотрении проблемы в электронном виде, заполнив форму обратной связи на сайте или отправив письмо на электронную почту.
Согласно законодательству, стандартный срок рассмотрения претензии составляет не более одного календарного месяца. К тексту обязательно нужно прикрепить фотографии в качестве доказательства факта нарушения, копию договора с УК и копию претензии, оставленной в Книге жалоб и предложений.
Региональные органы исполнительной власти
Региональные органы власти помогут решить вопрос, если управляющая компания и региональный оператор не соблюдают график, нарушают нормы сбора и хранения и не вывозят мусор. Куда обратиться — в городскую или районную администрацию.
К претензии необходимо приложить фотографии двора дома, прилегающих тротуаров, улицы и участка, на котором размещены контейнеры. Подать жалобу можно зарегистрировать на официальном сайте администрации, записаться на прием к руководителю через приемную или направить письмо при помощи электронной почты или в бумажном виде через почту России.
Оцените эту статью
[Total: 1 Average: 1]Жители Красноярска и края жалуются на невывоз мусора
Жители Красноярска накануне праздников жалуются на захламленные мусором дворы.
Вот так, к примеру, выглядит мусорный бак одного из дворов на улице Соколовская в Солнечном:
Это фото также сделали красноярцы:
Горожан предупреждали о перебоях с вывозом мусора из-за сильных морозов: техника не выдерживает крепких холодов, отказывают механизмы.
А эта фотография сделана в Лесосибирске:
«Холодно, морозы стоят, всё понимаем, но пакеты скоро на дороге уже будут лежать! С людей так каждый месяц сбор вовремя производится, а вывозить, как мы видим, не совсем», — пишут возмущенные лесосибирцы.
А вот такая картина сейчас в мкрн Солнечный в Канске:
Жители Канска пишут, что за горой мусора уже не видно даже мусорных баков: «Время 7:25, 30 декабря 2020. Мусорные компании, сделайте свою работу!».
Вот такая картина сейчас у подъездов домов в Норильске:
А это кадр, сделанный на одной из улиц Дудинки:
«В Дудинке мусоровозы так же замёрзли, как и в Норильске. Очень странно, что в регионе, где -40 — типичная зимняя температура, никому не пришло в голову, что техника для вывоза мусора должна быть рассчитана на такие морозы», — пишут жители города.
Эти кадры сняли жители Дудинки. Силами спецтехники разросшуюся мусрную кучу сгребли боближе к мусорным бакам, чтобы пакеты с отходами не были разбросаны по всей улице:
«Новый год жители Дудинки будут встречать на свалке. Коммунальщики не работают от слова совсем. Хотя техника, как видите, не замерзает. Приехали и сгребли мусор — сделали кучу ровнее», — пишет автор видео.
Фото: vk.com/kras_sunny, «ЯЖВК», vk.com/kansklife, vk.com/typical_norilsk, vk.com/kolesolsib, vk.com/id599502392
ООО «Природа» объяснила невывоз мусора на Туркестанской отсутствием подъездных путей
ООО «Природа» отреагировало на информацию в социальных сетях. 10 ноября в интернете появились материалы о невывозе твердых коммунальных отходов (ТКО) у дома 27 по ул Туркестанской областного центра.
Вот как «Природа» объясняет причину этой ситуации: «Даже после открытия в начале ноября основной дороги до конца не были восстановлены подъездные пути и съезды во дворы жилых домов. Доступ для крупногабаритной техники к контейнерным площадкам на части адресов до сих пор перекрыт. Проехать к местам сбора ТКО было невозможно не только мусоровозам, но и легковым автомобилям в июле, августе, сентябре, о чем оператор уведомил администрацию города, минприроды региона и Государственную жилищную инспекцию области. Через управляющие компании были направлены рекомендации для жителей о выносе отходов на соседние площадки».
Для обслуживания контейнеров на Туркестанской предназначены мусоровозы Scania с задней загрузкой — крупная техника, для разворота и работы которой требуется много места, поясняют в компании. Также проезду мешают припаркованные в ряд легковые автомобили. Чтобы объехать их, не повредив, требуется заезжать на бордюр и пешеходные дорожки в нарушение ПДД. Также при узком повороте под углом 90 градусов мусоровоз не сможет совершить маневр, если поблизости припаркованы автомобили жителей.
«На сегодняшний день спецтехника через раз может проехать по адресам Туркестанская, д. 27 и д. 41. Это приводит к переполнению контейнеров и появлению хаотично складированных отходов вокруг площадок. Ситуацию иногда позволяет исправить ломовоз, более компактный по размерам и предназначенный для сбора крупногабаритных отходов (КГО), но не реже одного раза в семь дней. Иначе график вывоза КГО по другим адресам смещается», — разъяснили ситуацию в пресс-службе «Природы».
Что касается ситуации 10 ноября, Вестираму заверили: твердые коммунальные отходы на Туркестанской, д. 27 были вывезены ломовозом. Кроме того, в компании предложили жителям указанных адресов обратиться в мэрию города с запросом об оборудовании заездов для спецтехники.
Почему в таких языках, как C и C ++, нет сборки мусора, а в Java?
Реальный ответ заключается в том, что единственный способ создать безопасный и эффективный механизм сборки мусора — это иметь поддержку на уровне языка для непрозрачных ссылок. (Или, наоборот, в отсутствует поддержка на уровне языка для прямого управления памятью.)
Java и C # могут это сделать, потому что у них есть специальные ссылочные типы, которыми нельзя манипулировать. Это дает среде выполнения свободу делать такие вещи, как , перемещать выделенные объекты в памяти , что имеет решающее значение для высокопроизводительной реализации GC.
Для записи: : ни одна современная реализация GC не использует подсчет ссылок , так что это просто отвлекающий маневр. Современные сборщики мусора используют коллекцию поколений, где новые выделения обрабатываются по существу так же, как выделения стека на таком языке, как C ++, а затем периодически любые вновь выделенные объекты, которые все еще живы, перемещаются в отдельное пространство «оставшихся в живых» и целое поколение объектов освобождается сразу.
У этого подхода есть свои плюсы и минусы: положительным моментом является то, что распределение кучи на языке, поддерживающем сборщик мусора, составляет так же быстро, как выделение стека на языке, который не поддерживает сборщик мусора, а недостатком является то, что объекты, которым необходимо выполнить очистку перед уничтожаются либо требуют отдельного механизма (например,грамм. C # с использованием ключевого слова ), иначе их код очистки выполняется недетерминированно.
Обратите внимание, что одним из ключей к высокопроизводительному сборщику мусора является необходимость наличия языковой поддержки для специального класса ссылок. C не имеет этой поддержки языка и никогда не будет; поскольку C ++ имеет перегрузку операторов, он может имитировать тип указателя GC, хотя это должно быть сделано осторожно. Фактически, когда Microsoft изобрела свой диалект C ++, который будет работать в среде CLR (среда выполнения .NET), им пришлось изобрести новый синтаксис для «ссылок в стиле C #» (e.), чтобы отличать их от «ссылок в стиле C ++» (например, Foo и ).
Что есть в C ++ и что регулярно используется программистами на C ++, так это интеллектуальных указателя , которые на самом деле являются просто механизмом подсчета ссылок. Я бы не стал считать подсчет ссылок «истинным» сборщиком мусора, но он дает многие из тех же преимуществ за счет более низкой производительности, чем ручное управление памятью или настоящий сборщик мусора, но с преимуществом детерминированного уничтожения.
В конце концов, ответ действительно сводится к особенностям языкового дизайна.C сделал один выбор, C ++ сделал выбор, который позволил ему быть обратно совместимым с C, но при этом предоставить альтернативы, которые достаточно хороши для большинства целей, а Java и C # сделали другой выбор, который несовместим с C, но также достаточно хорош для большинство целей. К сожалению, серебряной пули нет, но знание различных вариантов поможет вам выбрать правильный вариант для той программы, которую вы сейчас пытаетесь создать.
данных — почему сборка мусора очищает только кучу?
Переверните свой вопрос.Настоящий мотивирующий вопрос — , при каких обстоятельствах мы можем избежать затрат на сборку мусора?
Ну, во-первых, какие — это затраты на сборку мусора? Есть два основных вида затрат. Во-первых, вы должны определить, что является живым ; это требует потенциально много работы. Во-вторых, вам нужно уплотнить отверстия , которые образуются, когда вы освобождаете что-то, что было размещено между двумя объектами, которые все еще живы. Эти дыры расточительны.Но и уплотнять их тоже дорого.
Как избежать этих затрат?
Очевидно, что если вы можете найти схему использования хранилища, в которой вы никогда не выделяете что-то долгоживущее, затем выделяете что-то недолговечное, а затем выделяете что-то долгоживущее, вы можете исключить стоимость дыр. Если вы можете гарантировать, что для некоторого подмножества вашего хранилища каждое последующее выделение будет короче, чем предыдущее в этом хранилище, то в этом хранилище никогда не будет дыр.
Но если мы решили проблему с дырками, то мы решили и проблему со сборкой мусора . У вас есть что-то живое в этом хранилище? Да. Было ли все выделенное до этого долговечным? Да — это предположение — то, как мы устранили возможность дыр. Поэтому все, что вам нужно сделать, это сказать: «живы ли самые последние выделения?» и вы знаете, что все, что живо в этом хранилище.
Есть ли у нас набор распределений памяти, при котором мы знаем, что каждое последующее выделение короче предыдущего? Да! Кадры активации методов всегда уничтожаются в порядке, обратном тому, в котором они были созданы, потому что они всегда короче, чем активация, которая их создала.
Таким образом, мы можем хранить кадры активации в стеке и знать, что их никогда не нужно собирать. Если в стеке есть какой-либо фрейм, весь набор фреймов под ним является более долговечным, поэтому их не нужно собирать. И они будут уничтожены в порядке, обратном их созданию. Таким образом, исключаются затраты на сборку мусора для фреймов активации.
Вот почему у нас в первую очередь есть временный пул в стеке: потому что это простой способ реализовать активацию метода без ущерба для управления памятью.
(Конечно, стоимость сбора мусора в памяти , указанная на по ссылкам на кадры активации, все еще существует.)
Теперь рассмотрим систему потока управления, в которой кадры активации , а не уничтожаются в предсказуемом порядке. Что произойдет, если кратковременная активация может вызвать долгоживущую активацию? Как вы можете себе представить, в этом мире вы больше не можете использовать стек, чтобы избавиться от необходимости собирать активации. Набор активаций снова может содержать дыры.
C # 2.0 имеет эту функцию в виде yield return . Метод, возвращающий yield, будет повторно активирован позже — при следующем вызове MoveNext — и когда это произойдет, предсказать невозможно. Поэтому информация, которая обычно находится в стеке для кадра активации блока итератора, вместо этого хранится в куче, где она собирается мусором при сборе перечислителя.
Точно так же функция «async / await», которая появится в следующих версиях C # и VB, позволит вам создавать методы, активация которых «дает результат» и «возобновляет» в четко определенных точках во время действия метода.Поскольку кадры активации больше не создаются и не уничтожаются предсказуемым образом, вся информация, которая раньше хранилась в стеке, должна храниться в куче.
Это просто историческая случайность, что на протяжении нескольких десятилетий мы решили, что языки с фреймами активации, которые создаются и уничтожаются строго упорядоченным образом, являются модными. Поскольку в современных языках все чаще отсутствует это свойство, ожидайте увидеть все больше и больше языков, которые реифицируют продолжения в куче со сборкой мусора, а не в стеке.
Последний рубеж производительности Java: удаление сборщика мусора
Алексей Шипилев, разработчик производительности и OpenJDK в RedHat, подал новый проект JEP для создания бесполезного сборщика мусора; то есть сборщик мусора, который на самом деле не восстанавливает память. Этот сборщик нацелен на помощь разработчикам и исследователям JVM и, в меньшей степени, но, возможно, более интересен для общедоступных, сверхпроизводительных приложений, которые практически не генерируют мусора. Если JEP будет продолжен, новый сборщик мусора будет доступен вместе с существующими и не будет иметь никакого эффекта, если явно не активирован.
Сборка мусора и производительность Java — всегда сложная тема для решения, и, чтобы помочь прояснить ситуацию, InfoQ обратилась к чемпионам по Java и экспертам по производительности Мартину Вербургу и Кирку Пеппердайну. Мы также поговорили с Ремко Попмой, который руководит преобразованием Log4j без мусора, о том, как можно достичь этой цели. Вербург и Попма подтвердили, что, по их мнению, главными бенефициарами безоперационного GC, или Epsilon GC, как его еще называют, будут разработчики GC и исследователи производительности.Epsilon GC может служить контрольной переменной для измерения производительности других сборщиков мусора. В качестве упрощенного примера, у нас может быть приложение, работающее с безоперационным сборщиком мусора, для уменьшения накладных расходов на сборщик мусора (исключая другие соображения о распределении памяти и управлении мутациями). Если то же приложение затем запускается с той же рабочей нагрузкой, но с разными настроенными алгоритмами сборки мусора, разница в производительности будет указывать на влияние сборщика мусора на приложение. Это поможет разработчикам сборщиков мусора и исследователям производительности более изолированно понять поведение сборщиков мусора.
«Я думаю, что это действительно большой шаг вперед для обеспечения более точного тестирования различных частей JVM (таких как существующие компиляторы JIT C1 / C2, возможный переход на Graal и т. Д.). Это действительно добавит дополнительной долговечности для JVM «. Мартин Вербург
С другой стороны, Epsilon GC может выиграть от сверхпроизводительных приложений. Существует редкое поколение приложений и библиотек, таких как вышеупомянутый Log4j, которые были реализованы таким образом, что они не производят мусора и, следовательно, не нуждаются в сборщике мусора; для этого типа приложений производительность может быть улучшена за счет устранения накладных расходов на сборщик.Однако, как подчеркнул Попма, создание библиотеки, которая может работать с Epsilon GC, «потребует значительных инженерных усилий, чтобы убедиться, что память приложения управляется достаточно тщательно, чтобы она не закончилась», и даже тогда оценка рисков и выгод должна Чтобы убедиться, что выигрыш, полученный при выборе бесполезного сборщика мусора, согласуется со сложностью достижения состояния с нулевым мусором.
Однако может показаться трудным представить себе, как приложение может быть написано так, чтобы не создавать мусора, и хотя тема намного сложнее, чем то, что можно было бы объяснить в этой статье, ее может быть легче понять, приняв во внимание следующие соображения:
- Память в JVM управляется двумя разными механизмами: кучей и стеком; вот почему есть две разные ошибки, связанные с нехваткой памяти (
OutOfMemoryErrorиStackOverflowError).Память, размещенная в стеке, видна только текущему потоку и во время выполнения текущего метода; поэтому, когда текущий поток покидает текущий метод, эта память автоматически освобождается без использования сборщика мусора. Однако память в куче доступна для всего приложения в любой момент, что означает, что независимый сборщик мусора должен проверять, когда часть памяти больше не используется и может быть освобождена. - Выделение примитивов всегда происходит в стеке, поэтому сборщик мусора не оказывает никакого давления.Если бы кто-то писал код, используя в основном примитивные типы, сборщик мусора мог бы заботиться о меньшем количестве объектов.
- Не производить мусора — не то же самое, что не производить никаких предметов; объекты по-прежнему могут быть созданы без необходимости в сборщике мусора, который будет заботиться о них:
- Приложение или библиотека могут вначале создавать несколько объектов, а затем постоянно их повторно использовать; для этого разработчик должен очень хорошо понимать объем памяти, занимаемый приложением.
- Иногда компилятор может понять, что конкретный объект не будет использоваться вне метода; это известно как анализ побега. Когда обнаруживается, что объект не покидает метод, он может быть размещен в стеке, а не в куче, и поэтому автоматически удаляется, как только текущий метод завершается.
Хотя все это возможно, Пеппердайн указал, что это очень неестественный способ написания кода, который подразумевает потерю многих преимуществ, которые предоставляет Java, в то время как Вербург также указал, что управление памятью является как раз одной из основных причин, по которым Java имеет был настолько успешным в отрасли.В дополнение к этому, мы должны иметь в виду, что, несмотря на свое название, сборщик мусора не только выполняет задачу восстановления неиспользуемой памяти, но и выделяет новые блоки, и Epsilon GC все равно придется это делать. Pepperdine использует этот аргумент, чтобы предположить, что, по крайней мере теоретически, не будет значительной разницы в производительности между использованием Epsilon GC и любым другим алгоритмом сборки мусора, настроенным до такой степени, что он фактически не выполняет сборку мусора.
Однако, даже учитывая все эти предостережения, и Пеппердин, и Вербург подтвердили, что существует небольшая аудитория, для которой такое поведение может быть очень полезным, но тот факт, что эта аудитория мала, по словам Кирка, вызывает сомнения в ее полезности.Подавляющему большинству приложений в какой-то момент требуется освободить память, и поэтому им нужен функциональный сборщик мусора.
«Разумное время паузы GC просто не проблема для большинства приложений, так зачем отказываться от всех преимуществ Java ради сомнительного выигрыша в производительности». Кирк Пеппердин
Pepperdine также напомнил нам, что каждая новая функция увеличивает затраты на обслуживание OpenJDK, и поэтому разработчики OpenJDK должны учитывать общую картину при их добавлении.Oracle сокращает количество доступных сборщиков мусора именно для снижения затрат на обслуживание, и поэтому добавление GC, который будет полезен только небольшому проценту пользователей, может не представлять правильных инвестиций. Шипилев, похоже, учел эти моменты при подаче черновика JEP, и предварительный анализ, кажется, показывает, что накладные расходы будут минимальными в этом случае, судя по содержанию черновика JEP и прототипу, который уже был предоставлен. Фактически, и Пеппердин, и Вербург указали, что, учитывая опыт Шипилёва, тот факт, что он возглавляет эту инициативу, является достаточной причиной для оптимизма.
С другой стороны, Pepperdine также подчеркнул тот факт, что, хотя OpenJDK является эталонной реализацией JVM, нет требований к совместимости сборщика мусора, что означает, что поставщики могут реализовывать свои собственные алгоритмы и при этом быть полностью совместимыми со стандартной Java. . Это может вызвать разделение мнений среди общественности: хотя некоторые могут подумать, что реализация алгоритмов для нишевых рынков может быть чем-то более подходящим для коммерческих версий JVM, другие могут посчитать это очень полезным дополнением к OpenJDK.
@shipilev Zing на самом деле не имеет опции GC. Это очень полезно для тестирования. Некоторым людям понравится этот вариант в OpenJDK.
— Ницан Вакарт (@nitsanw) 12 февраля 2017 г.
Popma также рекомендовала, по крайней мере, рассмотреть возможность использования коммерческих JVM, когда производительность становится критической, поскольку стоимость лицензии на один из этих продуктов в целом может быть ниже, чем затраты на выбор и настройку конкретного алгоритма GC техническим персоналом. Однако, даже если кто-то был настроен на использование только технологий OpenJDK, и Попма, и Вербург упомянули находящийся в настоящее время в разработке Shenandoah GC, который нацелен на создание сверхнизкого времени паузы для очень больших куч (100 ГБ или более).В любом случае эксперты пришли к единому мнению, что когда дело доходит до производительности приложения, тщательно подобранный алгоритм GC почти всегда будет лучше, чем отсутствие GC вообще.
Это предложение еще только начинается, и его нужно пересмотреть и отполировать, прежде чем оно станет официальным JEP. Когда и если это произойдет, к нему в конечном итоге будет добавлена целевая версия. Хотя в настоящее время мы можем только предполагать, какой может быть эта целевая версия, Вербург считает, что разумно ожидать, что Epsilon GC будет готов для Java 10 или 11.Во всяком случае, это, по крайней мере, помогло бы понять, каким должен быть интерфейс GC, способствуя более модульной JVM.
Что это такое и как это работает — Stackify
Python — один из самых популярных языков программирования, и его использование продолжает расти. Он занял третье место на языке TIOBE в 2021 году благодаря темпам роста. Простота использования Python и большое сообщество сделали его популярным для анализа данных, веб-приложений и автоматизации задач.
В этом посте мы подробно рассмотрим сборку мусора в Python.Сначала мы рассмотрим основы управления памятью и то, зачем нам нужна сборка мусора. Затем мы посмотрим, как Python реализует сборку мусора. Наконец, мы на практике рассмотрим, как следует относиться к сборке мусора при написании приложений Python.
Что такое сборщик мусора Python и зачем он нам нужен?
Если Python — ваш первый язык программирования, сама идея сборки мусора может быть вам чужда. Начнем с основ.
Управление памятью
Язык программирования использует объекты в своих программах для выполнения операций. Объекты включают простые переменные, такие как строки, целые числа или логические значения. Они также включают более сложные структуры данных, такие как списки, хэши или классы.
Значения объектов вашей программы хранятся в памяти для быстрого доступа. Во многих языках программирования переменная в вашем программном коде — это просто указатель на адрес объекта в памяти. Когда переменная используется в программе, процесс будет считывать значение из памяти и работать с ним.
В ранних языках программирования большинство разработчиков отвечали за управление памятью в своих программах. Это означало, что перед созданием списка или объекта вам сначала нужно было выделить память для вашей переменной. После того, как вы закончили работу с переменной, вам нужно было освободить ее, чтобы «освободить» эту память для других пользователей.
Это привело к двум проблемам:
- Забыть освободить память . Если вы не освободите память, когда закончите ее использовать, это может привести к утечке памяти.Это может со временем привести к тому, что ваша программа будет использовать слишком много памяти. Для долго работающих приложений это может вызвать серьезные проблемы.
- Слишком быстрое освобождение памяти . Второй тип проблем заключается в освобождении вашей памяти, пока она еще используется. Это может привести к сбою вашей программы при попытке доступа к несуществующему значению в памяти или к повреждению ваших данных. Переменная, которая ссылается на освобожденную память, называется висячим указателем.
Эти проблемы были нежелательными, поэтому в новых языках добавлено автоматическое управление памятью.
Автоматическое управление памятью и сборка мусора
Благодаря автоматическому управлению памятью программистам больше не нужно самостоятельно управлять памятью. Скорее, среда выполнения сделала это за них.
Существует несколько различных методов автоматического управления памятью. Популярные используют подсчет ссылок. При подсчете ссылок среда выполнения отслеживает все ссылки на объект. Когда объект не имеет ссылок на него, он непригоден для использования программным кодом и может быть удален.
Для программистов автоматическое управление памятью дает ряд преимуществ. Быстрее разрабатывать программы, не задумываясь о деталях низкоуровневой памяти. Кроме того, это может помочь избежать дорогостоящих утечек памяти или опасных висячих указателей.
Однако автоматическое управление памятью требует затрат. Вашей программе потребуется дополнительная память и вычисления для отслеживания всех своих ссылок. Более того, многие языки программирования с автоматическим управлением памятью используют процесс «остановки мира» для сборки мусора, когда все выполнение останавливается, пока сборщик мусора ищет и удаляет объекты, подлежащие сборке.
С развитием компьютерной обработки в соответствии с законом Мура и увеличением объема оперативной памяти в новых компьютерах, преимущества автоматического управления памятью обычно перевешивают недостатки. Таким образом, большинство современных языков программирования, таких как Java, Python и Golang, используют автоматическое управление памятью.
Для долго работающих приложений, где производительность критична, на некоторых языках все еще есть ручное управление памятью. Классическим примером этого является C ++. Мы также видим ручное управление памятью в Objective-C, языке, используемом для macOS и iOS.Для новых языков Rust использует ручное управление памятью.
Теперь, когда мы знаем об управлении памятью и сборке мусора в целом, давайте более подробно рассмотрим, как работает сборка мусора Python.
Попробуйте бесплатный профилировщик кода Prefix от Stackify, чтобы написать лучший код на своей рабочей станции. Префикс работает с .NET, Java, PHP, Node.js, Ruby и Python.
Как Python реализует сборку мусора
В этом разделе мы рассмотрим, как сборка мусора работает в Python.
В этом разделе предполагается, что вы используете реализацию Python для CPython. CPython — наиболее широко используемая реализация. Однако существуют и другие реализации Python, такие как PyPy, Jython (на основе Java) или IronPython (на основе C #).
Чтобы узнать, какой Python вы используете, выполните следующую команду в своем терминале (Linux):
>>> python -c 'import platform; печать (platform.python_implementation ()) ' Или вы можете использовать эти строки как для терминалов Linux, так и для Windows.>>> импортная платформа >>> print (platform.python_imlplementation ()) CPython
В CPython есть два аспекта управления памятью и сборки мусора:
- Подсчет ссылок
- Сборка мусора поколений
Давайте рассмотрим каждый из них ниже.
Подсчет ссылок в CPython
Основным механизмом сборки мусора в CPython является подсчет ссылок. Всякий раз, когда вы создаете объект в Python, базовый объект C имеет как тип Python (например, список, dict или функция), так и счетчик ссылок.
На самом базовом уровне счетчик ссылок на объект Python увеличивается при каждой ссылке на объект и уменьшается при разыменовании объекта. Если счетчик ссылок на объект равен 0, память для этого объекта освобождается.
Код вашей программы не может отключить подсчет ссылок Python. Это контрастирует с поколенческим сборщиком мусора, обсуждаемым ниже.
Некоторые утверждают, что подсчет ссылок — это сборщик мусора для бедняков. У него есть некоторые недостатки, в том числе невозможность обнаруживать циклические ссылки, как описано ниже.Однако подсчет ссылок удобен тем, что вы можете немедленно удалить объект, если на него нет ссылок.
Просмотр счетчиков ссылок в Python
Вы можете использовать модуль sys из стандартной библиотеки Python для проверки счетчиков ссылок для определенного объекта. Есть несколько способов увеличить счетчик ссылок для объекта, например
- Назначение объекта переменной.
- Добавление объекта в структуру данных, например добавление в список или добавление в качестве свойства экземпляра класса.
- Передача объекта в качестве аргумента функции.
Давайте воспользуемся Python REPL и модулем sys, чтобы увидеть, как обрабатываются счетчики ссылок.
Сначала в терминале введите python , чтобы войти в Python REPL.
Во-вторых, импортируйте модуль sys в свой REPL. Затем создайте переменную и проверьте ее количество ссылок:
>>> import sys
>>> a = 'my-string'
>>> sys.getrefcount (a)
2
Обратите внимание, что есть две ссылки на наша переменная a .Один — от создания переменной. Второй — когда мы передаем переменную a в функцию sys.getrefcount () .
Если вы добавите переменную в структуру данных, такую как список или словарь, вы увидите увеличение количества ссылок:
>>> import sys
>>> a = 'my-string'
>> > b = [a] # Составьте список с a в качестве элемента.
>>> c = {'key': a} # Создать словарь с a в качестве одного из значений.
>>> sys.getrefcount (a)
4
Как показано выше, счетчик ссылок от до увеличивается при добавлении в список или словарь.
В следующем разделе мы узнаем о сборщике мусора поколений, который является вторым инструментом, который Python использует для управления памятью.
Сборка мусора поколений
Помимо стратегии подсчета ссылок для управления памятью, Python также использует метод, называемый сборщиком мусора поколений.
Самый простой способ понять, зачем нам нужен сборщик мусора поколений, — это на примере.
В предыдущем разделе мы видели, что добавление объекта в массив или объект увеличивает его счетчик ссылок. Но что произойдет, если вы добавите объект к самому себе?
>>> class MyClass (object):
... pass
...
>>> a = MyClass ()
>>> a.obj = a
>>> del a
В примере выше , мы определили новый класс. Затем мы создали экземпляр класса и назначили этот экземпляр свойством самого себя. Наконец, мы удалили экземпляр.
После удаления экземпляра он больше не будет доступен в нашей программе Python. Однако Python не уничтожил экземпляр по памяти. У экземпляра нет нулевого счетчика ссылок, потому что он ссылается на самого себя.
Мы называем этот тип проблем циклом обращений, и вы не можете решить их с помощью подсчета обращений. Это основная задача сборщика мусора поколений, который доступен модулю gc в стандартной библиотеке.
Терминология сборщика мусора поколений
Есть две ключевые концепции, которые следует понимать при работе со сборщиком мусора поколений.
- Первая концепция — это концепция поколения.
- Второе ключевое понятие — это порог.
Сборщик мусора отслеживает все объекты в памяти. Новый объект начинает свою жизнь в первом поколении сборщика мусора. Если Python выполняет процесс сборки мусора для одного поколения и объект выживает, он переходит во второе, более старое поколение. У сборщика мусора Python всего три поколения, и объект переходит в старшее поколение всякий раз, когда он выживает в процессе сборки мусора в своем текущем поколении.
Для каждого поколения модуль сборщика мусора имеет пороговое количество объектов. Если количество объектов превышает этот порог, сборщик мусора запускает процесс сбора. Любые объекты, пережившие этот процесс, переходят в старшее поколение.
В отличие от механизма подсчета ссылок, вы можете изменить поведение сборщика мусора поколений в вашей программе Python. Это включает изменение пороговых значений для запуска процесса сборки мусора в вашем коде.Кроме того, вы можете вручную запустить процесс сборки мусора или полностью отключить процесс сборки мусора.
Давайте посмотрим, как можно использовать модуль gc для проверки статистики сборки мусора или изменения поведения сборщика мусора.
Использование модуля GC
В терминале введите python , чтобы перейти в Python REPL.
Импортируйте модуль gc в свой сеанс. Затем вы можете проверить настроенные пороги вашего сборщика мусора с помощью метода get_threshold () :
>>> import gc
>>> gc.get_threshold ()
(700, 10, 10)
По умолчанию Python имеет порог 700 для самого молодого поколения и 10 для каждого из двух старших поколений.
Вы можете проверить количество объектов в каждом из ваших поколений с помощью метода get_count () :
>>> import gc
>>> gc.get_count ()
(596, 2, 1)
In В этом примере у нас есть 596 объектов в нашем самом молодом поколении, два объекта в следующем поколении и один объект в самом старом поколении.
Как видите, Python по умолчанию создает ряд объектов еще до того, как вы начнете выполнять свою программу. Вы можете запустить процесс сборки мусора вручную с помощью метода gc.collect () :
>>> gc.get_count () (595, 2, 1) >>> gc.collect () 577 >>> gc.get_count () (18, 0, 0)
Запуск процесса сборки мусора очищает огромное количество объектов — 577 объектов в первом поколении и еще три в старших поколениях.
Вы можете изменить пороговые значения для запуска сборки мусора с помощью метода set_threshold () в модуле gc:
>>> import gc
>>> gc.get_threshold ()
(700, 10, 10)
>>> gc.set_threshold (1000, 15, 15)
>>> gc.get_threshold ()
(1000, 15, 15)
В приведенном выше примере мы увеличиваем каждый из наших пороговых значений по сравнению с их значениями по умолчанию. Увеличение порога снизит частоту запуска сборщика мусора.Это будет менее затратно с точки зрения вычислений в вашей программе за счет более длительного хранения мертвых объектов.
Теперь, когда вы знаете, как работают и подсчет ссылок, и модуль сборщика мусора, давайте обсудим, как вы должны использовать это при написании приложений Python.
Что означает сборщик мусора Python для вас как разработчика
Мы потратили немало времени на обсуждение управления памятью в целом и его реализацию на Python. Пришло время сделать его полезным.Как вы должны использовать эту информацию как разработчик программ на Python?
Общее правило: не меняйте поведение сборщика мусора
Как правило, вам, вероятно, не следует слишком много думать о сборщике мусора Python. Одним из ключевых преимуществ Python является повышение производительности труда разработчиков. Отчасти это связано с тем, что это язык высокого уровня, который обрабатывает для разработчика ряд деталей низкого уровня.
Ручное управление памятью больше подходит для сред с ограничениями.Если вы действительно столкнетесь с ограничениями производительности, которые, по вашему мнению, могут быть связаны с механизмами сборки мусора Python, вероятно, будет полезнее увеличить мощность вашей среды выполнения, чем вручную изменять процесс сборки мусора. В мире закона Мура, облачных вычислений и дешевой памяти больше энергии легко доступно.
Это реалистично даже с учетом того, что Python обычно не освобождает память обратно базовой операционной системе. Любой процесс ручной сборки мусора, который вы выполняете для освобождения памяти, может не дать желаемых результатов.Дополнительные сведения в этой области см. В этой публикации об управлении памятью в Python.
Отключение сборщика мусора
Если оставить в стороне это предостережение, существуют ситуации, в которых вы можете захотеть управлять процессом сборки мусора. Помните, что подсчет ссылок, основной механизм сборки мусора в Python, отключить нельзя. Единственное поведение сборки мусора, которое вы можете изменить, — это генеральный сборщик мусора в модуле gc.
Один из наиболее интересных примеров изменения сборщика мусора поколений — это отключение сборщика мусора в Instagram.
Instagram использует Django, популярный веб-фреймворк Python, для своих веб-приложений. Он запускает несколько экземпляров своего веб-приложения на одном вычислительном экземпляре. Эти экземпляры запускаются с использованием механизма «главный-дочерний», в котором дочерние процессы совместно используют память с мастером.
Команда разработчиков Instagram заметила, что общая память резко упадет вскоре после создания дочернего процесса. При дальнейшем копании увидели, что виноват сборщик мусора.
Команда Instagram отключила модуль сборщика мусора, установив пороговые значения для всех поколений равными нулю.Это изменение привело к тому, что их веб-приложения стали работать на 10% эффективнее.
Хотя этот пример интересен, убедитесь, что вы находитесь в аналогичной ситуации, прежде чем идти по тому же пути. Instagram — это веб-приложение, обслуживающее многие миллионы пользователей. Для них стоит использовать нестандартное поведение, чтобы выжать каждый дюйм производительности своих веб-приложений. Для большинства разработчиков достаточно стандартного поведения Python в отношении сборки мусора.
Если вы думаете, что можете вручную управлять сборкой мусора в Python, сначала убедитесь, что вы понимаете проблему.Используйте такие инструменты, как Stackify Retrace, для измерения производительности вашего приложения и выявления проблем. Как только вы полностью поймете проблему, примите меры по ее устранению.
Начните 14-дневную БЕСПЛАТНУЮ пробную версию сегодня!
Завершение
В этом посте мы узнали о сборке мусора Python. Мы начали с изучения основ управления памятью и создания автоматического управления памятью. Затем мы рассмотрели, как сборка мусора реализована в Python с помощью автоматического подсчета ссылок и генерального сборщика мусора.Наконец, мы рассмотрели, насколько это важно для вас как разработчика Python.
Хотя Python выполняет большую часть сложных операций по управлению памятью, все же полезно знать, что происходит под капотом. Прочитав этот пост, вы теперь знаете, что вам следует избегать циклов обращения к Python, и вы должны знать, где искать, если вам нужен больший контроль над сборщиком мусора Python.
Основы сборки мусора | Документы Microsoft
- Читать 14 минут
В этой статье
В общеязыковой среде выполнения (CLR) сборщик мусора (GC) служит автоматическим диспетчером памяти.Сборщик мусора управляет выделением и освобождением памяти для приложения. Для разработчиков, работающих с управляемым кодом, это означает, что вам не нужно писать код для выполнения задач управления памятью. Автоматическое управление памятью может устранить распространенные проблемы, такие как забвение освобождения объекта и возникновение утечки памяти или попытка доступа к памяти для уже освобожденного объекта.
В этой статье описаны основные концепции сборки мусора.
Преимущества
Сборщик мусора обеспечивает следующие преимущества:
Освобождает разработчиков от необходимости вручную освобождать память.
Эффективно размещает объекты в управляемой куче.
Восстанавливает объекты, которые больше не используются, очищает их память и сохраняет доступную для будущих распределений. Управляемые объекты автоматически получают чистый контент для начала, поэтому их конструкторам не нужно инициализировать каждое поле данных.
Обеспечивает безопасность памяти, гарантируя, что объект не может использовать содержимое другого объекта.
Основы памяти
В следующем списке приведены важные концепции памяти CLR.
Каждый процесс имеет собственное отдельное виртуальное адресное пространство. Все процессы на одном компьютере используют одну и ту же физическую память и файл подкачки, если он есть.
По умолчанию на 32-разрядных компьютерах каждый процесс имеет виртуальное адресное пространство пользовательского режима размером 2 ГБ.
Как разработчик приложений вы работаете только с виртуальным адресным пространством и никогда не манипулируете физической памятью напрямую. Сборщик мусора выделяет и освобождает виртуальную память в управляемой куче.
Если вы пишете собственный код, вы используете функции Windows для работы с виртуальным адресным пространством. Эти функции выделяют и освобождают виртуальную память в собственных кучах.
Виртуальная память может находиться в трех состояниях:
Государство Описание Бесплатно Блок памяти не имеет ссылок на него и доступен для распределения. Зарезервировано Блок памяти доступен для вашего использования и не может использоваться для других запросов на выделение.Однако вы не можете сохранять данные в этом блоке памяти, пока они не будут зафиксированы. Выполнено Блок памяти назначен физическому хранилищу. Виртуальное адресное пространство может быть фрагментированным. Это означает, что в адресном пространстве есть свободные блоки, также известные как дыры. Когда запрашивается выделение виртуальной памяти, диспетчер виртуальной памяти должен найти единственный свободный блок, достаточно большой, чтобы удовлетворить этот запрос на выделение.Даже если у вас есть 2 ГБ свободного места, выделение, для которого требуется 2 ГБ, будет неудачным, если все это свободное пространство не будет в одном адресном блоке.
У вас может закончиться память, если не хватает виртуального адресного пространства для резервирования или физического пространства для фиксации.
Файл подкачки используется, даже если нехватка физической памяти (то есть потребность в физической памяти) низка. В первый раз, когда нагрузка на физическую память высока, операционная система должна освободить место в физической памяти для хранения данных, и она выполняет резервное копирование некоторых данных, находящихся в физической памяти, в файл подкачки.Эти данные не выгружаются на страницы до тех пор, пока они не понадобятся, поэтому возможно столкновение с разбиением на страницы в ситуациях, когда физическая нагрузка на память невысока.
Распределение памяти
Когда вы инициализируете новый процесс, среда выполнения резервирует непрерывную область адресного пространства для процесса. Это зарезервированное адресное пространство называется управляемой кучей. Управляемая куча поддерживает указатель на адрес, по которому будет размещен следующий объект в куче. Первоначально этот указатель устанавливается на базовый адрес управляемой кучи.Все ссылочные типы размещены в управляемой куче. Когда приложение создает первый ссылочный тип, для этого типа выделяется память по базовому адресу управляемой кучи. Когда приложение создает следующий объект, сборщик мусора выделяет для него память в адресном пространстве, которое следует сразу за первым объектом. Пока доступно адресное пространство, сборщик мусора продолжает таким образом выделять пространство для новых объектов.
Выделение памяти из управляемой кучи выполняется быстрее, чем выделение неуправляемой памяти.Поскольку среда выполнения выделяет память для объекта, добавляя значение к указателю, это почти так же быстро, как выделение памяти из стека. Кроме того, поскольку новые объекты, которые выделяются последовательно, непрерывно хранятся в управляемой куче, приложение может быстро получить доступ к объектам.
Выпуск памяти
Механизм оптимизации сборщика мусора определяет наилучшее время для выполнения сборки на основе выполняемых распределений. Когда сборщик мусора выполняет сборку, он освобождает память для объектов, которые больше не используются приложением.Он определяет, какие объекты больше не используются, проверяя корней приложения. Корни приложения включают статические поля, локальные переменные в стеке потока, регистры ЦП, дескрипторы сборщика мусора и очередь финализации. Каждый корень либо ссылается на объект в управляемой куче, либо имеет значение null. Сборщик мусора может запросить эти корни у остальной среды выполнения. Используя этот список, сборщик мусора создает граф, содержащий все объекты, доступные из корней.
Объекты, которых нет в графе, недоступны из корней приложения. Сборщик мусора считает недостижимые объекты мусором и освобождает выделенную для них память. Во время сборки сборщик мусора проверяет управляемую кучу в поисках блоков адресного пространства, занятых недоступными объектами. Обнаруживая каждый недостижимый объект, он использует функцию копирования памяти для сжатия доступных объектов в памяти, освобождая блоки адресных пространств, выделенные для недоступных объектов.После сжатия памяти для доступных объектов сборщик мусора вносит необходимые исправления в указатель, чтобы корни приложения указывали на объекты в их новых местах. Он также помещает указатель управляемой кучи после последнего достижимого объекта.
Память сжимается, только если коллекция обнаруживает значительное количество недостижимых объектов. Если все объекты в управляемой куче выживают в коллекции, то в уплотнении памяти нет необходимости.
Для повышения производительности среда выполнения выделяет память для больших объектов в отдельной куче.Сборщик мусора автоматически освобождает память для больших объектов. Однако, чтобы избежать перемещения больших объектов в памяти, эта память обычно не сжимается.
Условия сборки мусора
Сборка мусора происходит при выполнении одного из следующих условий:
В системе мало физической памяти. Это обнаруживается либо по уведомлению о нехватке памяти от ОС, либо по нехватке памяти, как указывается хостом.
Объем памяти, используемый выделенными объектами в управляемой куче, превышает допустимый порог.Этот порог постоянно корректируется по мере выполнения процесса.
Вызывается метод GC.Collect. Практически во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора работает непрерывно. Этот метод в основном используется для уникальных ситуаций и тестирования.
Управляемая куча
После инициализации сборщика мусора средой CLR он выделяет сегмент памяти для хранения объектов и управления ими. Эта память называется управляемой кучей, в отличие от собственной кучи в операционной системе.
Для каждого управляемого процесса есть управляемая куча. Все потоки в процессе выделяют память для объектов в одной куче.
Чтобы зарезервировать память, сборщик мусора вызывает функцию Windows VirtualAlloc и резервирует по одному сегменту памяти для управляемых приложений. Сборщик мусора также резервирует сегменты по мере необходимости и возвращает сегменты операционной системе (после очистки их от любых объектов) путем вызова функции Windows VirtualFree.
Важно
Размер сегментов, выделяемых сборщиком мусора, зависит от реализации и может изменяться в любое время, в том числе при периодических обновлениях.Ваше приложение никогда не должно делать предположений или зависеть от определенного размера сегмента, а также не должно пытаться настроить объем памяти, доступный для выделения сегментов.
Чем меньше объектов размещено в куче, тем меньше работы должен выполнять сборщик мусора. При размещении объектов не используйте округленные значения, превышающие ваши потребности, например выделение массива из 32 байтов, когда вам нужно всего 15 байтов.
Когда запускается сборщик мусора, сборщик мусора освобождает память, занятую мертвыми объектами.В процессе регенерации живые объекты уплотняются так, что они перемещаются вместе, а мертвое пространство удаляется, тем самым уменьшая размер кучи. Это гарантирует, что объекты, которые размещены вместе, останутся вместе в управляемой куче, чтобы сохранить свою локальность.
Интрузивность (частота и продолжительность) сборок мусора является результатом объема выделений и количества оставшейся памяти в управляемой куче.
Кучу можно рассматривать как скопление двух куч: кучи больших объектов и кучи малых объектов.Куча больших объектов содержит объекты размером 85 000 байт и более, которые обычно являются массивами. Экземплярный объект редко бывает очень большим.
Поколения
Алгоритм GC основан на нескольких соображениях:
- Сжать память для части управляемой кучи быстрее, чем для всей управляемой кучи.
- Более новые объекты имеют более короткий срок службы, а более старые объекты — более длительный срок службы.
- Более новые объекты, как правило, связаны друг с другом и доступны для приложения примерно в одно и то же время.
Сборка мусора в основном происходит с восстановлением недолговечных объектов. Чтобы оптимизировать производительность сборщика мусора, управляемая куча разделена на три поколения: 0, 1 и 2, поэтому она может обрабатывать долгоживущие и короткоживущие объекты отдельно. Сборщик мусора хранит новые объекты в поколении 0. Объекты, созданные на ранних этапах жизненного цикла приложения, которые выживают в коллекциях, продвигаются и сохраняются в поколениях 1 и 2. Поскольку сжатие части управляемой кучи происходит быстрее, чем всей кучи, эта схема позволяет сборщик мусора, чтобы освобождать память в определенном поколении, а не освобождать память для всей управляемой кучи каждый раз, когда он выполняет сборку.
Поколение 0 . Это самое молодое поколение, содержащее недолговечные объекты. Примером недолговечного объекта является временная переменная. В этом поколении сборка мусора происходит чаще всего.
Недавно размещенные объекты образуют новое поколение объектов и неявно являются коллекциями поколения 0. Однако, если это большие объекты, они помещаются в кучу больших объектов (LOH), которую иногда называют поколения 3 . Поколение 3 — это физическое поколение, которое логически собирается как часть поколения 2.
Большинство объектов возвращаются для сборки мусора в поколении 0 и не доживают до следующего поколения.
Если приложение пытается создать новый объект, когда поколение 0 заполнено, сборщик мусора выполняет сборку, пытаясь освободить адресное пространство для объекта. Сборщик мусора начинает с проверки объектов в поколении 0, а не всех объектов в управляемой куче. Одна только коллекция поколения 0 часто освобождает достаточно памяти, чтобы приложение могло продолжать создавать новые объекты.
Поколение 1 . Это поколение содержит короткоживущие объекты и служит буфером между короткоживущими и долгоживущими объектами.
После того, как сборщик мусора выполняет сборку для поколения 0, он сжимает память для доступных объектов и продвигает их до поколения 1. Поскольку объекты, которые выживают при сборках, как правило, имеют более длительный срок службы, имеет смысл повысить их до более высокого поколения. Сборщику мусора не нужно повторно проверять объекты в поколениях 1 и 2 каждый раз, когда он выполняет сборку поколения 0.
Если коллекция поколения 0 не освобождает достаточно памяти для приложения, чтобы создать новый объект, сборщик мусора может выполнить сборку поколения 1, затем поколения 2. Объекты в поколении 1, которые выживают после сборок, повышаются до поколения 2.
Поколение 2 . Это поколение содержит долгоживущие объекты. Примером долгоживущего объекта является объект в серверном приложении, который содержит статические данные, которые существуют в течение всего процесса.
Объекты в поколении 2, которые выживают в коллекции, остаются в поколении 2 до тех пор, пока они не будут определены как недоступные в будущей коллекции.
Объекты в куче больших объектов (которую иногда называют поколение 3 ) также собираются в поколении 2.
Сборка мусора происходит на определенных поколениях в зависимости от условий. Собирать поколение означает собирать предметы в этом поколении и во всех его младших поколениях.Сборка мусора поколения 2 также известна как полная сборка мусора, поскольку она освобождает объекты всех поколений (то есть все объекты в управляемой куче).
Выживание и акции
Объекты, которые не восстанавливаются при сборке мусора, называются выжившими и переходят в следующее поколение:
- Объекты, которые пережили сборку мусора поколения 0, повышаются до поколения 1.
- Объекты, которые пережили сборку мусора поколения 1, переводятся в поколение 2.
- Объекты, которые пережили сборку мусора поколения 2, остаются в поколении 2.
Когда сборщик мусора обнаруживает высокую выживаемость в поколении, он увеличивает порог выделения для этого поколения. Следующая коллекция получает значительный объем восстановленной памяти. CLR постоянно уравновешивает два приоритета: не позволять рабочему набору приложения становиться слишком большим, откладывая сборку мусора, и не позволять сборке мусора запускаться слишком часто.
Эфемерные поколения и сегменты
Поскольку объекты в поколениях 0 и 1 недолговечны, эти поколения известны как эфемерные поколения .
Эфемерные поколения выделяются в сегменте памяти, который известен как эфемерный сегмент. Каждый новый сегмент, полученный сборщиком мусора, становится новым эфемерным сегментом и содержит объекты, которые пережили сборку мусора поколения 0. Старый эфемерный сегмент становится сегментом нового поколения 2.
Размер эфемерного сегмента зависит от того, является ли система 32-битной или 64-битной, а также от типа работающего сборщика мусора (рабочая станция или серверный сборщик мусора). В следующей таблице показаны размеры эфемерного сегмента по умолчанию.
| Рабочая станция / сервер GC | 32-разрядная | 64-разрядная |
|---|---|---|
| Рабочая станция GC | 16 МБ | 256 МБ |
| Сервер GC | 64 МБ | 4 ГБ |
| Серверный GC с> 4 логическими процессорами | 32 МБ | 2 ГБ |
| Серверный GC с> 8 логическими процессорами | 16 МБ | 1 ГБ |
Эфемерный сегмент может включать объекты поколения 2.Объекты поколения 2 могут использовать несколько сегментов (столько, сколько требуется вашему процессу и позволяет память).
Объем памяти, освобожденной от эфемерной сборки мусора, ограничен размером эфемерного сегмента. Объем освобожденной памяти пропорционален пространству, которое было занято мертвыми объектами.
Что происходит во время сборки мусора
Сборка мусора состоит из следующих этапов:
Фаза маркировки, на которой выполняется поиск и создание списка всех живых объектов.
Фаза перемещения, которая обновляет ссылки на объекты, которые будут уплотнены.
Фаза уплотнения, которая восстанавливает пространство, занимаемое мертвыми объектами, и уплотняет уцелевшие объекты. На этапе сжатия объекты, пережившие сборку мусора, перемещаются к более старому концу сегмента.
Поскольку коллекции поколения 2 могут занимать несколько сегментов, объекты, которые продвигаются в поколение 2, могут быть перемещены в более старый сегмент.Выжившие поколения 1 и 2 могут быть перемещены в другой сегмент, поскольку они повышены до поколения 2.
Обычно куча больших объектов (LOH) не сжимается, поскольку копирование больших объектов снижает производительность. Однако в .NET Core и .NET Framework 4.5.1 и более поздних версиях вы можете использовать свойство GCSettings.LargeObjectHeapCompactionMode для сжатия кучи больших объектов по запросу. Кроме того, LOH автоматически уплотняется, когда устанавливается жесткий предел, если указать:
Сборщик мусора использует следующую информацию, чтобы определить, являются ли объекты активными:
Корни стека .Переменные стека, предоставляемые JIT-компилятором и обходчиком стека. Оптимизация JIT может удлинять или сокращать области кода, в которых переменные стека передаются сборщику мусора.
Дескрипторы сборки мусора . Дескрипторы, которые указывают на управляемые объекты и могут быть выделены пользовательским кодом или средой CLR.
Статические данные . Статические объекты в доменах приложений, которые могут ссылаться на другие объекты.Каждый домен приложения отслеживает свои статические объекты.
Перед началом сборки мусора все управляемые потоки приостанавливаются, за исключением потока, запустившего сборку мусора.
На следующем рисунке показан поток, который запускает сборку мусора и вызывает приостановку других потоков.
Неуправляемые ресурсы
Для большинства объектов, создаваемых вашим приложением, вы можете полагаться на сборку мусора для автоматического выполнения необходимых задач по управлению памятью.Однако неуправляемые ресурсы требуют явной очистки. Наиболее распространенный тип неуправляемого ресурса — это объект, который является оболочкой для ресурса операционной системы, такого как дескриптор файла, дескриптор окна или сетевое соединение. Хотя сборщик мусора может отслеживать время жизни управляемого объекта, который инкапсулирует неуправляемый ресурс, у него нет конкретных знаний о том, как очистить ресурс.
При создании объекта, который инкапсулирует неуправляемый ресурс, рекомендуется предоставить необходимый код для очистки неуправляемого ресурса в общедоступном методе Dispose .Предоставляя метод Dispose , вы позволяете пользователям вашего объекта явно освобождать его память, когда они закончат работу с объектом. При использовании объекта, который инкапсулирует неуправляемый ресурс, обязательно вызовите Dispose по мере необходимости.
Вы также должны предоставить способ освобождения ваших неуправляемых ресурсов на случай, если потребитель вашего типа забудет позвонить Dispose . Вы можете использовать безопасный дескриптор для упаковки неуправляемого ресурса или переопределить объект.Finalize () метод.
Дополнительные сведения об очистке неуправляемых ресурсов см. В разделе Очистка неуправляемых ресурсов.
См. Также
Повысьте производительность приложений с помощью этих передовых методов ГХ
Производительность приложений находится в центре нашего внимания, и оптимизация сборки мусора — хорошее место для небольших, но значимых улучшений
Автоматическая сборка мусора (вместе с JIT HotSpot Compiler) является одним из наиболее продвинутых и наиболее ценных компонентов JVM, но многие разработчики и инженеры гораздо менее знакомы с Garbage Collection (GC), как она работает и как она влияет на приложение. представление.
Во-первых, для чего вообще нужен GC? Сборка мусора — это процесс управления памятью для объектов в куче. По мере того, как объекты выделяются в куче, они проходят несколько этапов сбора — обычно довольно быстро, поскольку у большинства объектов в куче короткий срок жизни.
События сборки мусора состоят из трех этапов — маркировки, удаления и копирования / уплотнения. На первом этапе сборщик мусора просматривает кучу и помечает все как живые (ссылочные) объекты, объекты, на которые нет ссылок, или как доступное пространство памяти.Затем объекты, на которые нет ссылок, удаляются, а оставшиеся объекты уплотняются. В поколенческих сборках мусора объекты «стареют» и продвигаются через 3 пространства в своей жизни — Эдем, пространство выжившего и пространство владения (старое). Это смещение также происходит как часть фазы уплотнения.
Но хватит об этом, перейдем к самому интересному!
Psst! Ищете решение для повышения производительности приложений? OverOps помогает компаниям определять не только время и место замедления, но и то, почему и как они возникают.Посмотрите живую демонстрацию, чтобы увидеть, как это работает.
Знакомство со сборкой мусора (GC) в Java
Одна из замечательных особенностей автоматизированного сборщика мусора заключается в том, что разработчикам на самом деле не требуется , чтобы понять, как он работает. К сожалению, это означает, что многие разработчики НЕ понимают, как это работает. Понимание сборки мусора и множества доступных сборщиков мусора в чем-то похоже на знание команд Linux CLI. Технически вам не нужно их использовать, но знание и удобство их использования может существенно повлиять на вашу продуктивность.
Так же, как и с командами CLI, здесь есть абсолютные основы. ls команда для просмотра списка папок в родительской папке, mv для перемещения файла из одного места в другое и т. Д. В GC такие команды будут эквивалентны знанию того, что существует более одного GC для выбрать из, и этот сборщик мусора может вызвать проблемы с производительностью. Конечно, есть еще много чего узнать (об использовании Linux CLI И о сборке мусора).
Цель изучения процесса сборки мусора в Java — не только для беспричинных (и утомительных) разговоров, но и в том, чтобы научиться эффективно внедрять и поддерживать правильный сборщик мусора с оптимальной производительностью для вашей конкретной среды.Знать, что сборка мусора влияет на производительность приложения, является основным, и существует множество передовых методов для повышения производительности сборки мусора и уменьшения его влияния на надежность приложения.
Проблемы производительности GC
1. Утечки памяти —
Зная структуру кучи и то, как выполняется сборка мусора, мы знаем, что использование памяти постепенно увеличивается до тех пор, пока не произойдет событие сборки мусора и использование не снизится. Использование кучи для объектов, на которые имеются ссылки, обычно остается стабильным, поэтому уменьшение должно происходить до более или менее того же объема.
При утечке памяти каждое событие GC очищает меньшую часть объектов кучи (хотя многие оставленные объекты не используются), поэтому использование кучи будет продолжать увеличиваться до тех пор, пока память кучи не будет заполнена и не возникнет исключение OutOfMemoryError. Причина в том, что сборщик мусора помечает для удаления только те объекты, на которые нет ссылок. Таким образом, даже если объект, на который имеется ссылка, больше не используется, он не будет удален из кучи. Есть несколько полезных приемов программирования для предотвращения этого, о которых мы поговорим чуть позже.
2. Непрерывные мероприятия «Останови мир» —
В некоторых сценариях сборку мусора можно назвать событием Stop the World, потому что, когда оно происходит, все потоки в JVM (и, следовательно, приложение, работающее на нем) останавливаются, чтобы разрешить выполнение GC. В исправных приложениях время выполнения GC относительно невелико и не оказывает большого влияния на производительность приложения.
Однако в неоптимальных ситуациях события Stop the World могут сильно повлиять на производительность и надежность приложения.Если событие GC требует паузы Stop the World и занимает 2 секунды для выполнения, конечный пользователь этого приложения будет испытывать 2-секундную задержку, поскольку потоки, выполняющие приложение, останавливаются, чтобы разрешить GC.
Когда происходят утечки памяти, непрерывные события Stop the World также являются проблематичными. Поскольку при каждом выполнении сборщика мусора очищается меньше памяти кучи, для заполнения оставшейся памяти требуется меньше времени. Когда память заполнена, JVM запускает другое событие GC. В конце концов, JVM будет запускать повторяющиеся события Stop the World, вызывающие серьезные проблемы с производительностью.
3. Использование ЦП —
И все сводится к загрузке процессора. Основным признаком непрерывных событий GC / Stop the World является скачок загрузки ЦП. Сборщик мусора — это сложная с вычислительной точки зрения операция, поэтому на него может потребоваться больше, чем справедливая доля мощности процессора. Для сборщиков мусора, которые запускают параллельные потоки, загрузка ЦП может быть еще выше. Выбор правильного GC для вашего приложения будет иметь наибольшее влияние на использование ЦП, но есть и другие способы оптимизации для повышения производительности в этой области.
Из этих проблем производительности, связанных со сборкой мусора, мы можем понять, что, какими бы продвинутыми GC ни были (и они становятся довольно продвинутыми), их ахиллесова пята остается прежней.Избыточное и непредсказуемое размещение объектов. Чтобы повысить производительность приложения, недостаточно выбрать правильный сборщик мусора. Нам нужно знать, как работает этот процесс, и нам нужно оптимизировать наш код, чтобы наши сборщики мусора не потребляли чрезмерные ресурсы и не вызывали чрезмерных пауз в нашем приложении.
GC поколения
Прежде чем мы углубимся в различные Java GC и их влияние на производительность, важно понять основы генеральной сборки мусора. Основная концепция сборки мусора поколений основана на идее, что чем дольше существует ссылка на объект в куче, тем менее вероятно, что он будет помечен для удаления.Пометив объекты образным «возрастом», они могут быть разделены на разные области хранения, чтобы сборщик мусора помеивал их реже.
Когда объект размещается в куче, он помещается в так называемое пространство Эдема. Именно здесь объекты начинаются и в большинстве случаев именно здесь они помечаются для удаления. Объекты, которые выживают на этой стадии, «празднуют день рождения» и копируются в пространство Survivor. Этот процесс показан ниже:
Пространства Эдема и Выжившего составляют так называемое Молодое поколение.Здесь происходит основная часть действия. Когда (если) объект в молодом поколении достигает определенного возраста, он перемещается в временное (также называемое старым) пространство. Преимущество разделения памяти объектов по возрасту заключается в том, что сборщик мусора может работать на разных уровнях.
Незначительный сборщик мусора — это коллекция, которая ориентирована только на молодое поколение, фактически полностью игнорируя арендованное пространство. Как правило, большинство объектов в молодом поколении помечены для удаления, и основной или полный сборщик мусора (включая старое поколение) не требуется для освобождения памяти в куче.Конечно, при необходимости будет запущен Major или Full GC.
Одним из быстрых приемов оптимизации работы ГХ на основе этого является корректировка размеров областей кучи в соответствии с потребностями ваших приложений.
Типы коллекторов
Есть много доступных сборщиков мусора на выбор, и хотя G1 стал сборщиком мусора по умолчанию в Java 9, он изначально был предназначен для замены сборщика CMS, который является Low Pause, поэтому приложения, работающие с сборщиками пропускной способности, могут быть лучше подходят, оставаясь с их текущим сборщиком .Понимание операционных различий и различий в влиянии на производительность сборщиков мусора Java по-прежнему важно.
Коллекторы пропускной способности
Лучше для приложений, которые должны быть оптимизированы для обеспечения высокой пропускной способности и для достижения которых могут использоваться более высокие задержки.
Серийный —
Сборщик последовательного порта — самый простой, и вы вряд ли будете его использовать, поскольку он в основном предназначен для однопоточных сред (например, 32-разрядных или Windows) и для небольших куч.Этот сборщик может вертикально масштабировать использование памяти в JVM, но для освобождения неиспользуемых ресурсов кучи требуется несколько основных / полных сборщиков мусора. Это вызывает частые паузы Stop the World, из-за чего он не может использоваться во всех смыслах и целях в пользовательских средах.
Параллельно —
Как следует из названия, этот сборщик мусора использует несколько потоков, работающих параллельно, для сканирования и сжатия кучи. Хотя параллельный сборщик мусора использует несколько потоков для сборки мусора, он по-прежнему приостанавливает все потоки приложения во время работы.Сборщик Parallel лучше всего подходит для приложений, которые необходимо оптимизировать для обеспечения максимальной пропускной способности и которые могут допускать более высокую задержку при обмене.
Коллекторы с низкой паузой
Для большинства пользовательских приложений требуется GC с низкой паузой, чтобы на работу пользователя не влияли длительные или частые паузы. Все эти сборщики мусора предназначены для оптимизации скорости отклика (время / событие) и высокой краткосрочной производительности.
Параллельное сканирование меток (CMS) —
Подобно параллельному сборщику, коллектор Concurrent Mark Sweep (CMS) использует несколько потоков для маркировки и очистки (удаления) объектов, на которые нет ссылок.Однако этот GC инициирует события Stop the World только в двух конкретных случаях:
(1) при инициализации начальной маркировки корней (объектов в старом поколении, которые доступны из точек входа потока или статических переменных) или любых ссылок из метода main () и еще несколько
(2), когда приложение изменило состояние кучи при одновременном выполнении алгоритма, вынуждая его вернуться и сделать некоторые последние штрихи, чтобы убедиться, что у него есть правильные объекты, отмеченные
G1 —
Первый сборщик мусора (обычно известный как G1) использует несколько фоновых потоков для сканирования кучи, которую он разделяет на регионы.Он работает, сканируя в первую очередь те области, которые содержат наибольшее количество мусорных объектов, и присваивает им свое имя (сначала «мусор»).
Эта стратегия снижает вероятность исчерпания кучи до того, как фоновые потоки завершат сканирование неиспользуемых объектов, и в этом случае сборщику придется остановить приложение. Еще одно преимущество сборщика G1 заключается в том, что он сжимает кучу на ходу, что сборщик CMS делает только во время полных сборов Stop the World.
Повышение производительности ГХ
Производительность приложения напрямую зависит от частоты и продолжительности сборок мусора, а это означает, что оптимизация процесса сборки мусора осуществляется за счет уменьшения этих показателей.Есть два основных способа сделать это. Во-первых, с помощью корректировки размеров кучи молодого и старого поколений , а во-вторых, до уменьшите скорость выделения и продвижения объектов .
С точки зрения настройки размера кучи, это не так просто, как можно было бы ожидать. Логическим выводом было бы то, что увеличение размера кучи уменьшило бы частоту GC при увеличении продолжительности, а уменьшение размера кучи уменьшило бы продолжительность GC при увеличении частоты.
Дело в том, что продолжительность Minor GC зависит не от размера кучи, а от количества объектов, которые выживают в коллекции.Это означает, что для приложений, которые в основном создают недолговечные объекты, увеличение размера молодого поколения может фактически уменьшить как длительность сборки мусора на , так и частоту . Однако, если увеличение размера молодого поколения приведет к значительному увеличению количества объектов, которые необходимо скопировать в оставшиеся пространства, паузы сборки мусора будут длиться дольше, что приведет к увеличению задержки.
3 совета по написанию кода, эффективного для GC
Совет № 1: Прогнозирование емкости сбора —
Все стандартные коллекции Java, а также большинство настраиваемых и расширенных реализаций (таких как Trove и Google Guava) используют базовые массивы (примитивные или объектные).Поскольку массивы неизменны по размеру после выделения, добавление элементов в коллекцию во многих случаях может привести к тому, что старый базовый массив будет отброшен в пользу нового массива большего размера.
Большинство реализаций коллекций пытаются оптимизировать этот процесс перераспределения и сводить его к амортизированному минимуму, даже если ожидаемый размер коллекции не указан. Однако наилучших результатов можно достичь, предоставив коллекции ожидаемого размера при строительстве.
Совет № 2: Обработка потоков напрямую —
При обработке потоков данных, таких как данные, считанные из файлов или данные, загруженные по сети, например, очень часто можно увидеть что-то вроде:
Результирующий байтовый массив затем может быть преобразован в документ XML, объект JSON или сообщение буфера протокола, чтобы назвать несколько популярных вариантов.
При работе с большими файлами или файлами непредсказуемого размера это, очевидно, плохая идея, поскольку она подвергает нас OutOfMemoryErrors в случае, если JVM не может фактически выделить буфер размером с весь файл.
Лучший способ приблизиться к этому — использовать соответствующий InputStream (в данном случае FileInputStream) и передать его непосредственно в синтаксический анализатор, не считывая сначала все это в массив байтов. Все основные библиотеки предоставляют API для непосредственного анализа потоков, например:
Совет № 3: Используйте неизменяемые объекты —
Неизменяемость имеет много преимуществ.Один из них, которому редко уделяется должного внимания, — это его влияние на сборку мусора.
Неизменяемый объект — это объект, поля которого (и особенно непримитивные поля в нашем случае) не могут быть изменены после создания объекта.
Неизменяемость означает, что все объекты, на которые ссылается неизменяемый контейнер, были созданы до завершения создания контейнера. В терминах GC: контейнер, по крайней мере, такой же молодой, как и самая молодая ссылка, которую он содержит.Это означает, что при выполнении циклов сборки мусора для молодых поколений сборщик мусора может пропускать неизменяемые объекты, принадлежащие старшим поколениям, поскольку он точно знает, что они не могут ссылаться ни на что в собираемом поколении.
Меньшее количество объектов для сканирования означает меньшее количество страниц памяти для сканирования, а меньшее количество страниц памяти для сканирования означает более короткие циклы GC, что означает более короткие паузы GC и лучшую общую пропускную способность.
Для получения дополнительных советов и подробных примеров ознакомьтесь с этим сообщением, в котором подробно рассматриваются тактики написания кода с более эффективным использованием памяти.
*** Огромное спасибо Амиту Гурвицу из отдела исследований и разработок OverOps за его энтузиазм и проницательность, которые вошли в этот пост!
Что такое сборка мусора в Java — почему это требуется
Для многих мир Java окутан тайной и трудностями. Одно из таких начинаний — сборка мусора. Существует множество точек зрения на сборку мусора — хорошая она или плохая, когда она нужна, как часто ее следует запускать, как настроить операцию сборки мусора, как узнать, когда она работает не так, как ожидалось, и так далее.В этом обучающем посте мы попытаемся прояснить ситуацию со сборкой мусора Java и упростить разработчикам и администраторам работу с ней.
Что такое сборка мусора Java?
Приложения Java получают объекты в памяти по мере необходимости. Задача сборки мусора (GC) на виртуальной машине Java (JVM) состоит в том, чтобы автоматически определять, какая память больше не используется Java-приложением, и повторно использовать эту память для других целей. Поскольку память в JVM освобождается автоматически, разработчики приложений Java не обременены необходимостью явно освобождать неиспользуемые объекты памяти.Операция GC основана на предположении, что большинство объектов, используемых в коде Java, недолговечны и могут быть восстановлены вскоре после их создания. Поскольку объекты, на которые нет ссылок, автоматически удаляются из кучи, сборщик мусора делает память Java более эффективной.
Сборка мусора освобождает программиста от ручной работы с освобождением памяти. В результате определенные категории ошибок прикладных программ устраняются или существенно сокращаются с помощью GC:
.- Ошибки висячего указателя, которые возникают, когда часть памяти освобождается, пока на нее еще есть указатели, и один из этих указателей разыменован.К тому времени память, возможно, была переназначена для другого использования с непредсказуемыми результатами.
- Ошибки двойного освобождения, которые возникают, когда программа пытается освободить область памяти, которая уже была освобождена и, возможно, уже была повторно выделена.
- Определенные виды утечек памяти, при которых программе не удается освободить память, занятую объектами, которые стали недоступными, что может привести к исчерпанию памяти.
Обычно в Java происходит сборка мусора двух типов:
- Считается, что второстепенная или инкрементная сборка мусора произошла при удалении недостижимых объектов в динамической памяти молодого поколения.
- Считается, что основная или полная сборка мусора произошла, когда объекты, пережившие второстепенную сборку мусора и скопированные в кучу памяти старого или постоянного поколения, были удалены. По сравнению с молодым поколением, в старом поколении сборка мусора происходит реже.
Чтобы освободить память, JVM должна остановить выполнение приложения хотя бы на короткое время и выполнить сборку мусора. Этот процесс называется « остановка мира ».Это означает, что все потоки, за исключением потоков GC, перестанут выполняться, пока потоки GC не будут выполнены и объекты не будут освобождены сборщиком мусора.
Современные реализации GC пытаются свести к минимуму блокировку «остановок мира», выполняя как можно больше работы в фоновом режиме (т.е. используя отдельный поток), например, отмечая недостижимые экземпляры мусора, пока процесс приложения продолжает работать.
Сборка мусора потребляет ресурсы ЦП, чтобы решить, какую память освободить.Со временем были разработаны различные сборщики мусора, чтобы уменьшить количество пауз приложений, возникающих во время сборки мусора, и в то же время улучшить снижение производительности, связанное со сборкой мусора.
Традиционная JVM Oracle HotSpot имеет четыре способа выполнения операции GC:
- Serial , где только один поток выполнял GC
- Параллельный , где одновременно выполняются несколько второстепенных потоков, каждый из которых выполняет часть GC
- Concurrent Mark Sweep (CMS), , который аналогичен параллельному, также позволяет выполнять некоторые потоки приложений и снижает частоту остановки мира GC
- G1 , который также работает параллельно и одновременно, но работает иначе, чем CMS
Многие JVM, такие как Oracle HotSpot, JRockit, OpenJDK, IBM J9 и SAP JVM, используют методы сборки мусора с остановкой мира.Современные JVM, такие как Azul Zing, используют Continuously Concurrent Compacting Collector (C4) , который устраняет остановки сборки мусора, которые ограничивают масштабируемость в случае обычных JVM.
Почему так важен мониторинг сборки мусора?
Сборка мусора может непредсказуемым образом повлиять на производительность приложения Java. При частой активности сборщика мусора это увеличивает нагрузку на ЦП и замедляет обработку приложений. В свою очередь, это приводит к медленному выполнению бизнес-транзакций и в конечном итоге влияет на пользовательский опыт конечных пользователей, обращающихся к приложению Java.
Чрезмерная сборка мусора может произойти из-за утечки памяти в приложении Java. Недостаточное выделение памяти для JVM также может привести к увеличению активности по сбору мусора. И когда происходит чрезмерная сборка мусора, это часто проявляется в увеличении загрузки ЦП JVM!
Для оптимальной производительности Java-приложений критически важно отслеживать активность GC JVM. Для хорошей производительности полных сборщиков мусора должно быть немного. Время, затрачиваемое на сборку мусора, должно быть небольшим — обычно менее 5%, а процент использования ЦП, затрачиваемого на сборку мусора, должен быть очень низким (это позволяет потокам приложений использовать почти все доступные ресурсы ЦП).
Какие ключевые метрики сборки мусора нужно отслеживать?
Чтобы узнать, создает ли сборка мусора проблемы с производительностью Java, вам необходимо отслеживать все аспекты деятельности по сборке мусора в JVM:
|
|
Это позволяет определить, когда сборка мусора занимает слишком много времени и влияет на производительность, что поможет вам определить оптимальные настройки для каждого приложения на основе исторических шаблонов и тенденций.
Учет времени, затраченного на сборку мусора
Когда активность GC чрезмерна, сделайте дамп кучи памяти JVM и проанализируйте объекты, потребляющие верхнюю память. Любые необычно большие объекты — индикатор утечки памяти в коде приложения. С другой стороны, если ни один объект не занимает необычно большой объем памяти и если процент памяти, используемый любым из пулов памяти JVM, близок к 100%, это показатель того, что конфигурация памяти JVM может быть недостаточной.В этом случае вам может потребоваться увеличить соответствующий пул памяти JVM для повышения производительности приложения.
Сводка
Теперь, когда у нас есть четкое представление о сборке мусора в Java, давайте подведем итоги, ответив на некоторые вопросы, с которых мы начали блог:
- Сборка мусора — это хорошо или плохо? Определенно хорошо. Но, как гласит пословица, слишком много чего-либо — это плохо. Итак, вам необходимо убедиться, что память кучи Java правильно настроена и управляется, чтобы оптимизировать работу GC.
- Когда нужен ГХ? Требуется, когда есть объекты, на которые нужно удалить ссылки. Поскольку это не ручное действие, JVM автоматически позаботится об этом за вас. Из всей информации выше вы бы поняли, зачем нужен GC и когда. Итак, это ответ на этот вопрос.
- Как настроить сборку мусора? Есть два распространенных способа сделать это:
- Сведите количество объектов, переданных в область старого поколения, к минимуму
- Установите низкое время основного (или полного) GC
Некоторые важные параметры JVM, которые нужно настроить для правильного определения размера памяти JVM: -Xms, -Xmx и -NewRatio (соотношение размера нового и старого поколения)
- Как узнать, что ГХ не работает должным образом? Мониторинг JVM является ключевым.Обязательно отслеживайте жизненно важные метрики JVM и получайте предупреждения, когда активность сборки мусора отклоняется от нормы.
