Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=7873290&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 19:53:02 2016
Кодировка: Windows-1251
[java] утечка памяти - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
StepLg
смотритель

Рег.: 26.11.2005
Сообщений: 350
Из: Москва
Рейтинг: 25
  [java] утечка памяти
      11.09.2008 14:19
 

Java 1.5
профилировщик jmp

Программа, которая по своей сути представляет собой перевод данных из одной БД в другу с некоторой обработкой. То есть в цикле однотипные операции.

Базы большие, но уже на 50.000 записей вся память утекает.

вот заголовок дампа jmp
 
code:
class_name #instaces max #instances size #GC tenure -------------------------------------------------------------- Total 354414 486045 62065880 927800 4872186 byte[] 65348 65351 46652496 49368 922722 com.mysql.jdbc.ResultSetImpl 21680 21680 3642240 10 309991 java.lang.Object[] 84293 84295 2557224 38612 1189466 com.mysql.jdbc.PreparedStatement 10843 10843 2515576 0 155000 char[] 14090 55793 1821952 266946 162594 com.mysql.jdbc.Field 10841 10841 1561104 16 155015 java.util.ArrayList 21743 21743 521832 10957 310078 int[] 22092 30261 482728 72120 310291 com.mysql.jdbc.PreparedStatement$ParseInfo 10843 10843 433720 0 155018 boolean[] 21697 21697 348528 0 310051 java.lang.String 14261 38319 342264 160365 159676 java.util.HashMap$Entry 11965 14179 287160 25967 155531 com.mysql.jdbc.DatabaseMetaData 10845 10845 260280 0 155021 com.mysql.jdbc.RowDataStatic 10841 10841 260184 4 155015 com.mysql.jdbc.ByteArrayRow 7919 7919 126704 288 103804 java.lang.Object 10863 10863 86904 5 155023 java.lang.reflect.Field 314 398 22608 89 314 short[] 188 231 20744 314 241 java.lang.Class 183 183 17568 0 226 com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty 206 206 13184 0 412


То, что дальше - там совсем мелочи. То есть память отжирается где-то в при работе с мускулем. Кто-нибудь сталкивался с подобной проблемой, как решать и в каком направлении стоит смотреть?

halyavin
кфмн

Рег.: 14.12.2005
Сообщений: 916
Из: Moscow
Рейтинг: 622
  Re: [java] утечка памяти [re: StepLg]
      11.09.2008 15:47
 

Если есть возможность использовать java 1.6 можно воспользоваться фичей eclipse 3.4 "what links here". Для нахождения утекших объектов можно использовать глобальный WeakHashMap. Либо найти профайлер который показывает графы объектов.

StepLg
смотритель

Рег.: 26.11.2005
Сообщений: 350
Из: Москва
Рейтинг: 25
  Re: [java] утечка памяти [re: halyavin]
      11.09.2008 15:51
 

возможность использовать 1.6 - есть. а вот возможности отладки в графическом интерфейсе - нет. сервер, консоль, линукс :)

а можно как-то задампить всю информацию в текстовый файл, который потом на локальной машине в граф. интерфейсе просматривать?

halyavin
кфмн

Рег.: 14.12.2005
Сообщений: 916
Из: Moscow
Рейтинг: 622
  Re: [java] утечка памяти [re: StepLg]
      11.09.2008 16:08
 

Eclipse вроде поддерживает удаленную отладку (надеюсь приложение запускается из командной строки, а не каким-нибудь tomcat'ом), но я ни разу не пробовал.

yanys
Доктор Кот

Рег.: 08.10.2003
Сообщений: 2098
Рейтинг: 1394
  Re: [java] утечка памяти [re: StepLg]
      11.09.2008 16:21
1

Можно сдампить хип
code:
jmap -dump:format=b,file=heap.dump <pid>
потом натравить на дамп хипа jhat
code:
jhat.exe -J-mx512m heap.dump
Зайти броузером на 7000 порт и попробовать побродить по хипу. А вообще я б JProfiler взял, он конечно недешевый, но можно поюзать нелицензионный, если совесть позволит. Указываешь при запуске приложения на сервере использовать его profiling agent, а GUI запускаешь на рабочей станции и с комфортом разбираешься что да как.



Get your facts first, and then you can distort them as much as you please. Mark Twain
StepLg
смотритель

Рег.: 26.11.2005
Сообщений: 350
Из: Москва
Рейтинг: 25
  Re: [java] утечка памяти [re: yanys]
      11.09.2008 17:06
 

спасибо. как-нибудь на досуге попробую разобраться.

Serge
Carpal Tunnel

Рег.: 10.09.2002
Сообщений: 5952
Рейтинг: 2589
  Re: [java] утечка памяти [re: StepLg]
      11.09.2008 23:12
1

ну как бы самые тупые соображения
- все ли JDBC-объекты закрываютя?
- в чем выражается утекание памяти, как ты проверял расход памяти
- пробовал ли смотреть verbosegc и что там с кучей происходит



Merry Crimnash!
alepar

Рег.: 18.02.2004
Сообщений: 9216
Рейтинг: 3643
  Re: [java] утечка памяти [re: Serge]
      11.09.2008 23:49
 

Судя по дампу много резалтссетов и припейрд стейтментов. Так что ты прав видимо.



Whatever you do in life will be insignificant, but it's very important that you do it.
botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: [java] утечка памяти [re: StepLg]
      11.09.2008 23:52
1

В ответ на:

перевод данных из одной БД в другу с некоторой обработкой




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

потом есть ли в базе длинные данные, типа CLOB/BLOB?
их надо и/о стримами обрабатывать а не выбирать все в огромный byte[]

профайлеры это конечно хорошо, но зачастую гораздо больше можно понять сделав логгирование основных операций
(в log4j TRACE в java logging FINEST)
типа: открыт резалтсет с id таким-то, закрыт резалтсет с id таким-то из него было выбрано столько то записей




Хватит дрочить на рейтинги
StepLg
смотритель

Рег.: 26.11.2005
Сообщений: 350
Из: Москва
Рейтинг: 25
  Re: [java] утечка памяти [re: Serge]
      12.09.2008 10:27
 


 
В ответ на:

- все ли JDBC-объекты закрываютя?



jdbc всего два, они постоянно используются

 
В ответ на:

- в чем выражается утекание памяти, как ты проверял расход памяти



слежением за тем, что с памятью происходит во время работы. постоянный рост от 50 мб до 4ГБ с учетом свопа - я думаю очевидно, что это утечка. При алгоритме, который в цикле выполняет одни и те же операции и ничего в памяти (по идее) хранить не должен.

 
В ответ на:

пробовал ли смотреть verbosegc и что там с кучей происходит



нет. попробую посмотреть.

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

Minotaurus
addict

Рег.: 19.04.2007
Сообщений: 433
Рейтинг: 635
  Re: [java] утечка памяти [re: StepLg]
      13.09.2008 01:50
 


 
Quote:


 - все ли JDBC-объекты закрываютя?




Quote:


jdbc всего два, они постоянно используются




Сутя по всему, ты подразумеваешь под JDBC объектами только Connection'ы. Закрывать надо также Statement'ы и ResultSet'ы

Fj_
Carpal Tunnel

Рег.: 12.09.2004
Сообщений: 8795
Рейтинг: 3287
  Re: [java] утечка памяти [re: StepLg]
      13.09.2008 17:05
-4

Quote:

сервер, консоль, линукс



А ты поставь на сервере хвинды, гном какой-нибудь и эклипсу, на своем компе xming и сиди в ней графически, лол.



The data is the error (c)IIS FTP Server.
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: [java] утечка памяти [re: halyavin]
      13.09.2008 18:33
1

Quote:

надеюсь приложение запускается из командной строки, а не каким-нибудь tomcat'ом



если в гугле набрать tomcat , то он сам продолжает: remote debug
и, что характерно, дает ссылки на инструкции



You can't always get what you want
halyavin
кфмн

Рег.: 14.12.2005
Сообщений: 916
Из: Moscow
Рейтинг: 622
  Re: [java] утечка памяти [re: gadfather]
      14.09.2008 18:24
 

Круто, не знал. И видимо не я один, раз народ постоянно спрашивает ;)

botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: [java] утечка памяти [re: Minotaurus]
      15.09.2008 09:51
 

В ответ на:

Сутя по всему, ты подразумеваешь под JDBC объектами только Connection'ы. Закрывать надо также Statement'ы и ResultSet'ы




уточню
когда закрываешь коннекшен, то все остальное автоматически закроется
стейтменты надо закрывать сразу после их использования, это понятно
а вот резалтсеты не надо закрывать вообще
они сами закрываются 1) если закрыть стейтмент (или коннекшен) 2) если в стейтменте открыть новый резалт сет
если этих двоих пунктов не происходит а резалт сет надо закрыть - то это ОЧЕНЬ странно



Хватит дрочить на рейтинги
Serge
Carpal Tunnel

Рег.: 10.09.2002
Сообщений: 5952
Рейтинг: 2589
  Re: [java] утечка памяти [re: botWi]
      15.09.2008 14:07
1

Quote:

они сами закрываются 1) если закрыть стейтмент (или коннекшен) 2) если в стейтменте открыть новый резалт сет




Это в спецификации. Как ведет себя драйвер MySql - неизвестно. :)



Merry Crimnash!
botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: [java] утечка памяти [re: Serge]
      15.09.2008 16:18
 

ну можно же джаднуть и посмотреть :)




Хватит дрочить на рейтинги
alepar

Рег.: 18.02.2004
Сообщений: 9216
Рейтинг: 3643
  Re: [java] утечка памяти [re: botWi]
      15.09.2008 20:46
 

Quote:

если этих двоих пунктов не происходит а резалт сет надо закрыть - то это ОЧЕНЬ странно



CallableStatement.executeQuery в цикле с разными параметрами но одним и тем же запросом.
outParameter - курсор. На примере оракла - оно само не закрывается.
Думаю, еще полно примеров, когда резалтсет не будет закрыт при шаренном запросе в цикле.



Whatever you do in life will be insignificant, but it's very important that you do it.
alepar

Рег.: 18.02.2004
Сообщений: 9216
Рейтинг: 3643
  Re: [java] утечка памяти [re: Serge]
      15.09.2008 21:08
 

а в спецификации точно есть пункт 2?



Whatever you do in life will be insignificant, but it's very important that you do it.
botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: [java] утечка памяти [re: alepar]
      15.09.2008 21:31
1

В ответ на:

а в спецификации точно есть пункт 2?




джавадок к резалтсету

В ответ на:


A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.




а вот джавадок к стейтменту:
В ответ на:

All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.




но к препареду и коллаблу такого джавдока нет
и как бы {@inheritDoc} не стоит
тоесть реализация может чо угодно делать :(






Редактировал botWi (15.09.2008 21:42)
Хватит дрочить на рейтинги
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в