Каков наилучший способ принудительного использования GC на экземпляре ThreadLocal?Что является лучшим способом принудительного использования GC на экземпляре ThreadLocal?
ответ
Простой ответ: вы не можете заставить GC в java. Некоторые могут писать трюки, но в целом вы просто не можете.
Ну, на самом деле вы можете. С выходом!
Простой и некрасиво ответ:
System.gc();
Это не гарантирует, сбор мусора конкретного объекта, но он будет говорить VM, чтобы приложить усилия для выполнения общего сбора мусора.
В частности, для переменной ThreadLocal содержащийся экземпляр переменной не будет GC'd, пока нить не исчезнет, или экземпляр ThreadLocal больше не будет доступен. Таким образом, вам нужно будет убить связанный поток, или вам нужно будет отменить свои ссылки на переменную ThreadLocal, чтобы System.gc()
имел какой-либо эффект.
Однако тот факт, что вы вызываете это, указывает на большую проблему в вашем коде. Если вы хотите избавиться от объекта, просто не имея ссылок на него, должно быть достаточно. VM придет через некоторое время и очистит ваш беспорядок.
Повторить: нет причин, по которым чистый код должен быть явно вызван GC.
Не правда. ThreadLocal реализуется как слабая карта хэша. Сборщик мусора не может вернуть память, если вы явно не заставляете это делать это. – user26365 2008-11-24 20:13:29
Насколько мне известно, нет специального «принудительного» контракта на сбор мусора с WeakHashMap (или с любым объектом, если на то пошло). Как правило, сборщик мусора будет освобождать место в слабой карте хэша всякий раз, когда ключ больше не используется в «обычном использовании». – 2008-11-24 22:10:26
jlibs library has a good utility class for garbage collection. Вы можете принудительно собрать сбор мусора с помощью отличного маленького трюка с объектами WeakReference.
RuntimeUtil.gc() из jlibs:
/**
* This method guarantees that garbage collection is
* done unlike <code>{@link System#gc()}</code>
*/
public static void gc() {
Object obj = new Object();
WeakReference ref = new WeakReference<Object>(obj);
obj = null;
while(ref.get() != null) {
System.gc();
}
}
Вы не можете заставить GC и во многих случаях, когда вы бежите в контейнере, даже вызывая System.gc() не поможет, так как виртуальная машина, как правило, устанавливается с - XX: + DisableExplicitGC. JVM будет игнорировать ваши явные вызовы.
A ThreadLocal<Object>
- всего лишь ключ. Фактические значения сохраняются в каждой строке Thread
. Слабая карта хэша, которая отображает слабыйThreadLocal
до сильныйObject
.
Предположим, что ни у кого другого нет ссылки на Object
в ThreadLocal
. Тогда есть два способа оценить ценность значения ThreadLocal для сбора мусора. Во-первых, есть простой способ:
- Резьбовые концы (внутри установки его threadLocals карту в
null
). - Мусороуборочный комбайн работает, удаляя
Thread
ThreadLocalMap
и все недостижимыеObject
s внутри него.
Но если поток все еще работает, то эта последовательность должна произойти прежде, чем ваш Object
может быть мусор:
- Вы теряете все ссылки на
ThreadLocal
. - Сборщик мусора удаляет
ThreadLocal
. - Вы
set()
некоторое количество другихThreadLocal
s в пределах этой темы, аThreadLocalMap
удаляет простую запись с карты. Необходимое число является недетерминированным, поскольку в отличие от стандартаWeakHashMap
,ThreadLocalMap
только выдает несколько устаревших записей за раз и только наset()
, а неget()
. - Сборщик мусора, наконец, удаляет
Object
.
Чтобы смягчить проблему медленной сборки мусора, вы можете позвонить ThreadLocal.remove()
из каждого Thread
, если этот поток не нужен объект больше.
- 1. DllImport vs LoadLibrary, что является лучшим способом?
- 2. Что является лучшим способом использования JQuery в Asp.net
- 3. , что является лучшим способом использования password_hash и password_verify
- 4. Android - что является лучшим способом использования мероприятий (лучшая практика)
- 5. Что является лучшим способом использования логического значения для условного оператора
- 6. Язык домена: что является лучшим способом выразить?
- 7. Android, что является лучшим способом убить AbstractThreadedSyncAdapter?
- 8. Что является лучшим/безопасным способом переустановки Homebrew?
- 9. В CSS, что является лучшим способом принудительного прерывания строки после элемента, чем сделать его блочным элементом?
- 10. Является ли Cookies лучшим способом?
- 11. Что является лучшим способом для div на mousemove() в jquery?
- 12. Что является лучшим (общепринятым) способом отправки данных (сообщений) на сервер
- 13. Статическое членство наследования в C#, что является лучшим способом?
- 14. , который является лучшим способом редактирования значения RLIMIT_NPROC
- 15. Что является лучшим способом скрыть все содержимое от пользователей IE8
- 16. Ruby: что является лучшим способом узнать тип метода в method_missing?
- 17. Что является лучшим способом избежать «системы из памяти» в node.js?
- 18. что является лучшим способом для сайта wordpress с laravel api
- 19. Что является лучшим способом получить дату и время в Clojure?
- 20. Карта apache путь к различным машинам, что является лучшим способом?
- 21. В JSF, что является лучшим способом предотвратить фальсификацию формы?
- 22. При использовании cocoapods, что является лучшим способом изменить PRODUCT_NAME?
- 23. Что является лучшим способом для алгоритма о введении
- 24. В C#, что является лучшим/общепринятым способом создания цепочки конструкторов?
- 25. Что является лучшим способом титульным полотна с URL
- 26. bash - что является лучшим способом улучшить производительность этого кода
- 27. Использование AWK, что является лучшим способом изменить свойство XML
- 28. Расширения Visual Studio для генерации кода ... что является лучшим способом
- 29. Что является лучшим способом отзывчивого стиля, чем позиция CSS
- 30. Если утверждения в функции, что является лучшим способом
На самом деле вы можете заставить gc() [проверить мой ответ на эту тему] используя слабые ссылки и не покидая;) – shams 2011-08-02 16:16:43