Использование памяти Java не может освободить - PullRequest
0 голосов
/ 07 декабря 2010

Я написал приложение, которое взаимодействует с odbc и передает сообщения в графический интерфейс. По какой-то причине в ходе кампании использование памяти javas возрастает до 1 ГБ. Приложение простое и не должно так загружаться в памяти ... Я думаю, что потоки так заняты и ни в коем случае не задыхаются, у java нет возможности освободить память, которую она выделяет, поэтому она продолжает расти и расти. То, что я хотел бы сделать, это где-то в потоке заставить Java освободить память. Может кто-нибудь сказать мне, как это сделать?

спасибо ..

Ответы [ 6 ]

2 голосов
/ 07 декабря 2010

Вы не можете заставить jvm освободить память. Ваше приложение просто имеет утечки памяти. Вы должны использовать java profiler (например, jvisualvm, который находится в jdk), чтобы найти эти утечки

2 голосов
/ 07 декабря 2010

Попробуйте использовать профилировщик, такой как visualVM (входит в JDK6) или eclipse TPTP .

В качестве отправной точки: Вы закрываете все операторы и наборы результатов?С mysql я встречал памяти с помощью JDBC-драйвера.

1 голос
/ 07 декабря 2010

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

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

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


Для решения этой проблемы могут использоваться следующие вопросы:

1 голос
/ 07 декабря 2010

Вы не можете заставить java освободить память, вы можете предложить это только через System.gc(). Но я думаю, что это не твоя главная проблема. Я предлагаю вам профилировать ваше приложение с Eclipse MAT , это анализатор памяти, который легко понять. Если вы обнаружите утечку памяти, опубликуйте ее здесь, чтобы мы могли увидеть, как ее решить.

0 голосов
/ 07 декабря 2010

Зависит от JVM, например, Oracle JRockit может настроить схему сжатия в командной строке:

http://download.oracle.com/docs/cd/E15289_01/doc.40/e15062/optionxx.htm#BABGFFID

0 голосов
/ 07 декабря 2010

Вы не можете заставить java освободить память, но вы можете запросить это, используя:

System.gc()

Тот факт, что вы наблюдаете постепенное увеличение использования памяти с течением времени, указывает на утечки памяти, и никакие обращения к System.gc не освободят эту память. Посмотрите на некоторые из инструментов профилирования, упомянутых выше, и используйте их для отслеживания использования памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...