Базовая система Java сталкивается с такой большой нагрузкой, с которой сборщик мусора не может справиться, и есть утечки памяти. Как это можно решить?Устранение утечки памяти из сборщика мусора
ответ
Я очень сомневаюсь в этом. утечки памяти, если только с помощью собственного кода, на самом деле является случаем раздувания памяти. Memory bloat - это просто объекты, имеющие сильные ссылки, которые никогда не выходят из строя.
В Java, единственный способ, которым вы можете столкнуться с утечкой памяти, - это удерживать ссылку, которую вам больше не нужно. Так как ваше приложение по-прежнему имеет доступ к ссылке, сборщик мусора не сможет его очистить, и у мусора сборщик действительно не может понять, что это утечка.
Единственное, что нужно сделать, это исправить утечки. Что касается того, как их найти и обнаружить ... У меня, к сожалению, не очень много предложений. Возможно, вы могли бы добавить код в свои модульные тесты, чтобы убедиться, что функции освобождают память, которая им больше не нужна? Или вы можете запускать свои модульные тесты с большой памятью VM, чтобы определить, какие подразделения отвечают за большинство распределений? Существуют некоторые шаблоны, которые обычно могут привести к утечке. Например, удерживая подстроку большей строки (например, если вы читаете файл в строке), так как подстрока поддерживает ссылку на строку, из которой она исходит. Я полагаю, что программу можно было бы записать, чтобы обнаружить эту и другие общие шаблоны, которые приводят к утечкам. Тем не менее, я не знаю о какой-либо доступной в настоящее время программе, которая делает это возможное обнаружение утечки.
Если вы используете необычную реализацию JVM, «утечки» памяти действительно возникают, когда вы держитесь за объекты намного дольше, чем нужно. Если Java обнаруживает, что объект по-прежнему доступен, он никогда не будет собирать его, поскольку это может повлиять на семантику программы.
Если вы заинтересованы в сокращении использования памяти, попробуйте разбить ссылки на объекты, которые вам больше не нужны, или используйте WeakReference
s или WeakHashMap
s, чтобы объекты были сохранены таким образом, чтобы их можно было автоматически восстановить.
Если вы хотите попытаться отследить, что именно сидит в памяти, теряя пространство, вы можете проверить this paper на обнаружение утечек памяти, посмотрев на доступ к объектам. Этот инструмент, по-видимому, работает достаточно хорошо, хотя я не знаком с этим.
Надеюсь, это поможет!
поэтому инструмент, на который ссылается бумага, SWAT, звучит интересно, но Google не раскрывает фактическую реализацию для загрузки. Или я чего-то не хватает? – orangepips
Хммм ... Я действительно не знаю, где взять копию. :-(Я дам вам знать, найду ли что-нибудь. – templatetypedef
jmap - ваш друг. Есть утечки в текущем (солнце/оракуле) JVM, но я очень сомневаюсь, о чем говорит OP. Финализаторы просто похожи на фантомные ссылки (impl by java.lang.ref.FinalReference, они не путают GC на своем собственном праве, что делает объект доступным методом finalize чем-то другим)
Это не то, как работает Java GC ... –
Это домашнее задание? – Mehrdad
Как найти утечку памяти Java: http://stackoverflow.com/questions/40119/how-to-find-a-java-memory-leak –