2011-01-09 3 views
1

Базовая система Java сталкивается с такой большой нагрузкой, с которой сборщик мусора не может справиться, и есть утечки памяти. Как это можно решить?Устранение утечки памяти из сборщика мусора

+3

Это не то, как работает Java GC ... –

+2

Это домашнее задание? – Mehrdad

+0

Как найти утечку памяти Java: http://stackoverflow.com/questions/40119/how-to-find-a-java-memory-leak –

ответ

2

Я очень сомневаюсь в этом. утечки памяти, если только с помощью собственного кода, на самом деле является случаем раздувания памяти. Memory bloat - это просто объекты, имеющие сильные ссылки, которые никогда не выходят из строя.

2

В Java, единственный способ, которым вы можете столкнуться с утечкой памяти, - это удерживать ссылку, которую вам больше не нужно. Так как ваше приложение по-прежнему имеет доступ к ссылке, сборщик мусора не сможет его очистить, и у мусора сборщик действительно не может понять, что это утечка.

Единственное, что нужно сделать, это исправить утечки. Что касается того, как их найти и обнаружить ... У меня, к сожалению, не очень много предложений. Возможно, вы могли бы добавить код в свои модульные тесты, чтобы убедиться, что функции освобождают память, которая им больше не нужна? Или вы можете запускать свои модульные тесты с большой памятью VM, чтобы определить, какие подразделения отвечают за большинство распределений? Существуют некоторые шаблоны, которые обычно могут привести к утечке. Например, удерживая подстроку большей строки (например, если вы читаете файл в строке), так как подстрока поддерживает ссылку на строку, из которой она исходит. Я полагаю, что программу можно было бы записать, чтобы обнаружить эту и другие общие шаблоны, которые приводят к утечкам. Тем не менее, я не знаю о какой-либо доступной в настоящее время программе, которая делает это возможное обнаружение утечки.

1

Если вы используете необычную реализацию JVM, «утечки» памяти действительно возникают, когда вы держитесь за объекты намного дольше, чем нужно. Если Java обнаруживает, что объект по-прежнему доступен, он никогда не будет собирать его, поскольку это может повлиять на семантику программы.

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

Если вы хотите попытаться отследить, что именно сидит в памяти, теряя пространство, вы можете проверить this paper на обнаружение утечек памяти, посмотрев на доступ к объектам. Этот инструмент, по-видимому, работает достаточно хорошо, хотя я не знаком с этим.

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

+0

поэтому инструмент, на который ссылается бумага, SWAT, звучит интересно, но Google не раскрывает фактическую реализацию для загрузки. Или я чего-то не хватает? – orangepips

+0

Хммм ... Я действительно не знаю, где взять копию. :-(Я дам вам знать, найду ли что-нибудь. – templatetypedef

0

jmap - ваш друг. Есть утечки в текущем (солнце/оракуле) JVM, но я очень сомневаюсь, о чем говорит OP. Финализаторы просто похожи на фантомные ссылки (impl by java.lang.ref.FinalReference, они не путают GC на своем собственном праве, что делает объект доступным методом finalize чем-то другим)