Schetchiksg.ru

Счетчик СГ
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как сделать счетчик ссылок

Можно ли получить счетчик ссылок на объекты?

Я хотел бы знать, есть ли способ проверить, сколько ссылок имеет объект Java. Насколько я мог проверить, единственный способ сделать это-использовать JVMTI через интерфейс JNI. Существует ли чистое решение java (без использования собственных библиотек) для получения этой информации?

Мы разрабатываем образовательный инструмент для анимации структуры данных(который будет использоваться при реализации студентами определенных алгоритмов), поэтому было бы очень хорошо, если бы мы могли проверить наличие объектов «released» самым ненавязчивым способом (я стараюсь не заставлять пользователя этого инструмента вызывать такой метод, как ObjectReleased(objRef), чтобы обновить анимацию структуры данных для удаления элемента или чего-то подобного).)

2 ответа

  • счетчик ссылок

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

Для общего компонента из более чем 2 продуктов Windows Installer хранит количество ссылок на этот общий компонент, чтобы удаление одного из этих продуктов не повредило другие продукты. Я хотел бы знать, как это можно сделать, где хранится счетчик ссылок общего компонента. Как я могу сбросить.

Из вашего описания кажется, что вы меньше заботитесь о фактическом количестве ссылок, чем о том, чтобы просто знать, когда объект был собран. Если это так, вы можете использовать WeakReference или PhantomReference, чтобы определить, когда ссылочный объект готов к завершению.

Надеюсь, это поможет.

Java, насколько мне известно, не предлагает эту опцию изначально.

Здесь у вас есть некоторые рекомендации о том, как сделать это вручную:

Похожие вопросы:

Эй там:) Можно ли сделать счетчик для того, сколько человек поделилось вашим сайтом на facebook и twitter? Я думаю структурировать код следующим образом. Они видят только facebook и twitter как.

Как получить счетчик ссылок для объекта Можно ли определить, имеет ли объект javascript несколько ссылок на него? Или если у него есть ссылки, кроме той, с которой я обращаюсь к нему ? Или даже.

Я перефразировал этот вопрос. Когда объекты .net предоставляются клиентам COM через итерацию COM, создается CCW ( вызываемая оболочка COM), которая находится между клиентом COM и управляемым.

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

Для общего компонента из более чем 2 продуктов Windows Installer хранит количество ссылок на этот общий компонент, чтобы удаление одного из этих продуктов не повредило другие продукты. Я хотел бы.

Мне нравятся функции smart_ptr Boost и возможность преобразования в shared_ptr и weak_ptr и обратно, но поскольку счетчик ссылок не содержится в самом указанном классе, следующий код не работает (и.

Я хотел бы знать, есть ли способ узнать количество ссылок(дескрипторов) на объект в System Verilog. Я могу вычислить put, чтобы поместить статический счетчик в метод new() для новых объектов, но для.

C++11 ввел умные указатели, такие как std::shared_ptr. Этот класс хранит указатель и счетчик ссылок. Когда счетчик ссылок достигает нуля, вызывается обратный вызов (deleter). Мой вопрос заключается.

Например, я знаю, как взять произвольный набор ключей и использовать их для создания ссылок на объекты, подобных этому. $arr = array(A, B, C); foreach($arr as $key): echo $obj-> <$key>. n;.

Если у нас есть некоторый класс интеллектуальных указателей, который может принимать произвольный объект и предоставлять указатель с подсчетом ссылок, как мы фактически сохраняем целое число.

Track link

Что такое track link

Tracking URL, или отслеживание ссылок, как правило, применяется в маркетинге для мониторинга и определения эффективности маркетинговых продвижений и рекламных кампаний. Другими словами, tracking URL – это отслеживание количества кликов, переходов по ссылкам.

Читайте так же:
Поверка счетчиков надо делать или менять

Какие ссылки можно отслеживать:

  • размещенные на веб-сайте;
  • установленные в письмах;
  • добавленные в сообщениях и постах в соц. сетях;
  • связанные с рекламными объявлениями и баннерами (PPC);
  • установленные на различных источниках трафика.

Без отслеживания невозможно определить, откуда и куда идёт трафик, эффективность тех или иных источников, как и эффективность самой рекламы. Счётчик переходов по ссылке реализовывается с использованием специальных функций или инструментов. Платформа AdsBridge – это отличный трекер для решения этих задач.

Как работает трекинг-ссылка в AdsBridge

На AdsBridge трекинг-ссылка работает следующим образом:

  • На платформе вы создаёте кампанию, в которой настраиваете необходимые правила распределения трафика, передаваемые параметры, принимаемые параметры, добавляете лендинги и офферы.
  • После создания кампании система автоматически генерирует её ссылку, которую необходимо скопировать.
  • Добавьте скопированную URL на источник трафика (баннер, сайт, объявление и т.д.).

AdsBridge не только отслеживает количество кликов, но и даёт возможность передавать параметры с источника трафика на трекер и даже на сторону оффера и партнёрской сети.

При клике на url кампании все данные записываются в статистику. Их в дальнейшем можно использовать для анализа, сравнения и оценки эффективности рекламы и качества трафика.

Отслеживание кликов, или счётчик переходов по ссылке, на собственном веб-ресурсе – позволят оптимизировать его, привлечь более релевантный трафик, повысить эффективность и конверсию. На AdsBridge также можно проводить сплит-тесты элементов сайта, что позитивно скажется на эффективности работы.

Чтобы использовать трекинг платформу для собственного сайта вам нужно:

  • создать кампанию в своем аккаунте;
  • в правиле распределения добавить свой сайт;
  • url кампании добавить на источники трафика (например, в рекламные объявления, баннера, посты в соц. сетях и т.д.).

При переходе по ссылке этой кампании, пользователь будет попадать на ваш сайт, но при этом все данные будут записаны в статистику трекера.

Track link происходит в онлайн режиме, а значит, вам не нужно устанавливать дополнительные программы, ведь AdsBridge – облачная платформа.

Возможности отслеживания партнерских ссылок

При работе с партнёрскими сетями или отдельными офферами напрямую, не менее важно tracking link. Партнерские tracking URL – это отслеживание ссылок офферов.

Используя несколько партнёрских сетей или же отдельные офферы, возникают сложности с трекингом и оценкой эффективности. При помощи функционала AdsBridge вы можете собрать все данные в одном месте, на одной платформе и, таким образом, свести всё в единую статистику.

Необходимо просто создать офферы в своём аккаунте и использовать их. В одну кампанию вы можете добавлять офферы из разных партнёрских сетей, и тем самым тестировать их, распределять трафик по определённым правилам и условиям.

Статистику можно просмотреть как общую, для сравнения элементов между собой по определённым параметрам, так и по конкретному элементу. Есть возможность просматривать статистику по отдельной партнёрской сети, это позволит определить, какой оффер из этой сети приносит больше конверсий.

Тестируйте различные ссылки, отслеживайте их и анализируйте результаты в одном месте. Tracking URL на AdsBridge – это лучшее решение для эффективной работы!

Подсчет ссылок атомарными переменными в C/C++ и GCC

Введение
Зачем нужен подсчет ссылок?

Чтобы объяснить, почему эти два механизма обеспечивают наилучшую производительность и чем могут быть полезны атомарные переменные, рассмотрим следующую ситуацию.

Первый поток (манипулятор) должен найти определенный объект в структуре данных и изменить его. Второй поток (стиратель) удаляет устаревшие объекты. Время от времени, первый поток пытается оперировать объектом, который второй поток пытается удалить. Это классический сценарий, который можно найти практически в любой многопоточной программе.

Очевидно, что два потока должны работать с каким-то механизмом взаимного исключения (mutual exclusion — прим. пер.). Допустим, мы защищаем всю структуру данных одним мьютексом. В этом случае потоку манипулятора приходится удерживать мьютекс заблокированным до тех пор, пока он не найдет объект и не обработает его. Это значит, что у потока стирателя не будет доступа к структуре данных до тех пор, пока поток манипулятора не завершит свою работу. Если все, что делает поток манипулятора — это поиск записей и их обработка, то поток стирателя просто не сможет получить доступ к структуре данных.

Читайте так же:
Счетчик с управлением по сети

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

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

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

Можно было бы использовать другой мьютекс, защищающий содержимое актуального объекта. Но тут появляется важный вопрос, который мы должны себе задать. Сколько мьютексов потребуется для защиты содержимого объекта?

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

Предположим, мы создали мьютекс на каждый объект. Как мы должны управлять мьютексами для объектов? Мы можем поместить мьютекс в сам объект, но это создаст следующую дополнительную проблему. В случае, если поток стирателя решит удалить объект, но за мгновение до этого поток манипулятора решит проверить объект и попытается заблокировать его мьютекс. Так как мьютекс уже забрал поток стирателя, манипулятор уйдет в спячку. Но сразу же после этого ухода, стиратель удалит объект и его мьютекс, оставив манипулятор спящим на несуществующем объекте. Ой.

В действительности, есть несколько вещей, которые мы можем сделать. Один из них — применение подсчета ссылок на объекты. Однако, мы должны защитить сам счетчик ссылок. К счастью, благодаря атомарным переменным, нам не нужно использовать мьютекс для защиты счетчика.

О том, как мы будем использовать атомарные переменные для подсчета ссылок на объекты

Сначала мы проинициализируем наш счетчик ссылок на объект единицей. Когда поток манипулятора начнет его использовать, он должен увеличить счетчик ссылок на единицу. Закончив работать с объектом, он должен уменьшить счетчик ссылок. То есть, до тех пор, пока манипулятор использует объект, он должен держать счетчик ссылок инкрементированным.

Как только поток стирателя решит удалить какой-либо объект, ему нужно сначала удалить его из структуры данных. Для этого он должен удержать мьютекс, защищающий структуру данных. После чего он должен уменьшить на единицу счетчик ссылок на объект.

Теперь вспомним, что мы инициализировали счетчик ссылок единицей. Таким образом, если объект не используется, его счетчик ссылок должен стать нулевым. Если он нулевой, мы можем безопасно удалить объект. Это все потому, что так как объекта уже нет в структуре данных, мы можем быть уверены, что первый поток больше не будет его использовать.

А если его счетчик ссылок больше, чем один? В этом случае мы должны ждать, пока счетчик ссылок потоков не станет нулевым. Но, как это сделать?

Ответить на этот вопрос может быть весьма сложно. Обычно я рассматриваю один из двух подходов. Наивный подход или подход, который я называю подходом RCU (Read-copy update – прим. пер.).

Наивный подход

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

Читайте так же:
Счетчик роста веса с возрастом

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

Подход RCU

RCU — это другой механизм синхронизации. В основном он используется в ядре Linux. Можете прочитать о нем здесь. Я называю это подходом RCU, потому что у него есть некоторое сходство с тем, как работает механизм синхронизации RCU.

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

Допустим, что потоку манипулятора в основном требуется одна минута для выполнения своих манипуляций. Здесь я специально преувеличиваю. Когда поток стирателя попытается удалить объект, все что он должен сделать — это захватить мьютекс или spinlock, защищающий структуру данных, содержащую объекты, и удалить объект из этой структуры данных.

Далее, он должен получить текущее время и сохранить его в объекте. У объекта должны быть методы, позволяющие вспомнить время собственного удаления. Затем поток стирателя добавит его в конец списка удаленных объектов. Это особый список, который содержит все объекты, которые мы хотим удалить — так же, как и в наивном подходе.


Обратите внимание, что добавление объектов в конец списка делает их отсортированными по времени их удаления. Более ранние в списке те объекты, у которых раньше время удаления.

Далее, поток стирателя должен вернуться в начало списка, захватить объект и убедиться, что прошла одна минута с того времени, когда он был убран из структуры данных. Если так, то он должен проверить свой ​​счетчик ссылок и убедиться, что он действительно нулевой. Если нет, то ему следует обновить его время удаления на текущее и добавить его в конец списка. Отметим, что обычно такого не должно произойти. Если счетчик ссылок потока стирателя нулевой, то он должен убрать объект из списка и удалить его.

Чтобы показать, как это работает, посмотрите на рисунок выше. Допустим, сейчас 15:35:12. Это больше, чем одна минута после того, как мы удалили первый объект. Поэтому, как только стиратель активируется и проверит список, он сразу увидит, что первый объект в списке был удален больше минуты назад. Пришло время удалить объект из списка и проверить следующий.

Он проверит следующий объект, увидит, что он в списке меньше минуты и оставит его в списке. Теперь — интересная особенность этого подхода. Поток стирателя не должен проверять остальную часть списка. Потому что мы всегда добавляем объекты в конец списка, список отсортирован и поток стирателя может быть уверен, что остальные объекты также не должны быть удалены.

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

Когда появились атомарные переменные?

Начиная с версии 4.1.2, у gcc есть встроенная поддержка атомарных переменных. Они работают на большинстве архитектур, но перед их использованием, пожалуйста, проверьте, что ваша архитектура их поддерживает.

Существует набор функций, оперирующих атомарными переменными.

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

Каждая из этих функций оперирует переменной определенного типа. Типом может быть как char, short, int, long, long long, так и их беззнаковые эквиваленты.

Читайте так же:
Металлический столб под счетчик

Неплохая идея — обернуть эти функции чем-то, что скрывает детали реализации. Это может быть класс, представляющий атомарную переменную или абстрактный тип данных.

Наконец, есть мой хороший пример по использованию атомарных переменных в статье простой многопоточный тип доступа к данным и атомарные переменные.

Заключение

Надеюсь, что статья окажется интересной. Для дополнительных вопросов, пожалуйста, пишите на e-mail (указан в оригинале — прим. пер.).

Примечание переводчика

Данная и другие статьи автора не претендуют на полноту охвата материала по теме, но у них хороший вводный стиль изложения.

Сборка мусора

Введение

Примеры

Подсчет ссылок

Подавляющее большинство управления памятью Python выполняется с подсчетом ссылок.

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

Когда счетчик ссылок достигает нуля, объект немедленно уничтожается и память сразу же освобождается. Таким образом, в большинстве случаев сборщик мусора даже не нужен.

Для дальнейшей демонстрации концепции ссылок:

Сборщик мусора для эталонных циклов

Единственный раз , когда требуется сборщик мусора , если у вас есть ссылочный цикл. Простейшим примером эталонного цикла является тот, в котором A относится к B, а B относится к A, в то время как ничто иное не относится ни к A, ни к B. Ни A, ни B не доступны из любой точки программы, поэтому их можно безопасно уничтожить, все же их счетчики ссылок равны 1, и поэтому они не могут быть освобождены одним алгоритмом подсчета ссылок.

Референтный цикл может быть произвольно длинным. Если A указывает на B указывает на C указывает на . указывает на Z, который указывает на A, то ни один от A до Z не будет собираться до фазы сбора мусора:

Эффекты команды del

Удаление имени переменной из сферы , используя del v , или удаление объекта из коллекции с помощью del v[item] или del[i:j] , или удаление атрибута с помощью del v.name , или любой другой способ удаления ссылок на объект, не вызывает какую — либо деструктор вызовы или любая память освобождения и сам по себе. Объекты уничтожаются только тогда, когда их счетчик ссылок достигает нуля.

Повторное использование примитивных объектов

Интересная вещь, которая может помочь оптимизировать ваши приложения, заключается в том, что примитивы на самом деле также пересчитываются под капотом. Давайте посмотрим на цифры; для всех целых чисел от -5 до 256 Python всегда использует один и тот же объект:

Обратите внимание , что RefCount возрастает, а это означает , что и a b ссылаться на тот же объект , лежащим в основе , когда они относятся к 1 примитиву. Однако для больших чисел Python фактически не использует базовый объект:

Поскольку RefCount для 999999999 не изменяется при назначении его a и b мы можем сделать вывод , что они относятся к двум различным базовым объектам, несмотря на то, что они оба назначены тому же примитивно.

Просмотр отсчета объекта

Насильственное освобождение объектов

Вы можете принудительно освободить объекты, даже если их refcount не равен 0 в Python 2 и 3.

Обе версии используют ctypes модуль , чтобы сделать это.

ВНИМАНИЕ: делать это оставит вашу среду Python неустойчивы и склонны к врезаться без TRACEBACK! Использование этого метода также может создать проблемы с безопасностью (весьма маловероятно). Только освобождать объекты, которые, вы уверены, вы никогда больше не будете ссылаться. Когда-либо.

import ctypes deallocated = 12345 ctypes.pythonapi._Py_Dealloc (ctypes.py_object (deallocated)) импорт ctypes, sys deallocated = 12345 (ctypes.c_char * sys.getsizeof (deallocated)). from_address (id (deallocated)) [: 4] = ‘ x00’ * 4

После запуска любая ссылка на теперь освобожденный объект приведет к тому, что Python вызовет неопределенное поведение или произойдет сбой — без обратной трассировки. Вероятно, была причина, почему сборщик мусора не удалил этот объект .

Читайте так же:
Жилищник вешняки поверка счетчиков

Если вы не освободить None , Вы получаете специальное сообщение — Fatal Python error: deallocating None , прежде чем врезаться.

Управление сборкой мусора

Есть два подхода к влиянию, когда выполняется очистка памяти. Они влияют на то, как часто выполняется автоматический процесс, а другой вручную запускает очистку.

Сборщиком мусора можно управлять, настраивая пороги сбора, которые влияют на частоту, с которой работает сборщик. Python использует систему управления памятью на основе поколения. Новые объекты сохраняются в новейшей генерации — generation0 и с каждыми выжили коллекции, объекты продвинут на старшие поколения. Не Достигнув последнего поколения — generation2, они больше не способствовали.

Пороговые значения можно изменить с помощью следующего фрагмента:

Первый аргумент представляет собой пороговое значение для сбора generation0. Каждый раз , когда число отчислений превышает число deallocations на 1000 сборщик мусора будет называться.

Старшие поколения не очищаются при каждом запуске, чтобы оптимизировать процесс. Вторые и третьи аргументы не являются обязательными и контролировать , как часто моют старшие поколения. Если generation0 был обработан 100 раз без очистки generation1, то generation1 будет обработано. Аналогичным образом , объекты в generation2 будут обрабатываться только тогда , когда те , в generation1 были очищены в 10 раз , не касаясь generation2.

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

Ручной запуск коллекции можно выполнить, как показано в следующем фрагменте:

Сборка мусора запускается автоматически в зависимости от количества выделений и освобождений, а не от используемой или доступной памяти. Следовательно, при работе с большими объектами память может быть исчерпана до запуска автоматической очистки. Это хороший пример использования для вызова сборщика мусора вручную.

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

Для долго выполняющихся программ сборка мусора может запускаться по времени или по событию. Примером первого является веб-сервер, который запускает коллекцию после фиксированного числа запросов. В последующем — веб-сервер, который запускает сборку мусора при получении запроса определенного типа.

Не ждите, чтобы очистить сборку мусора

Тот факт, что сборщик мусора будет очищен, не означает, что вы должны ждать очистки цикла сбора мусора.

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

В следующем коде предполагается, что файл будет закрыт в следующем цикле сборки мусора, если f была последней ссылкой на файл.

Более явный способ очистки заключается в вызове f.close() . Вы можете сделать это еще более элегантным, то есть, используя with заявлением, также известный как менеджер контекста :

with утверждением позволяет отступа кода под открытым файлом. Это делает явным и легче видеть, как долго файл остается открытым. Он также всегда закрывает файл, даже если исключение возникает в while блок.

Синтаксис

Параметры

Примечания

Научим основам Python и Data Science на практике

Это не обычный теоритический курс, а онлайн-тренажер, с практикой на примерах рабочих задач, в котором вы можете учиться в любое удобное время 24/7. Вы получите реальный опыт, разрабатывая качественный код и анализируя реальные данные.

голоса
Рейтинг статьи
Ссылка на основную публикацию