|
|
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Для работы з БД использую EJB 3.0 Есть такой клас-сущность: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Ну вот добавляю я таблицу "bore_data" какие-то дание, скажем с помощью таймера на 1с. Где-то через сутку Джава машина зависает. Проверил какие обьекты создаются в памяти и оказалось что всему виной клас сущности BoreData, их создается все больше и больше и все они висят в памяти, что и приводит к зависанию. Как с этим бороться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 17:53:07 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
denis11111 , Узнать, где они застревают и ликвидировать эту утечку. Где конкретно это происходит - ответ ищите в дампе JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 18:02:52 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
svenom denis11111 , Узнать, где они застревают и ликвидировать эту утечку. Где конкретно это происходит - ответ ищите в дампе JVM. Меня интересует: это особенность EJB, или мой прокол. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 18:11:37 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
C вероятностью 99.9% это ваш косяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 18:25:22 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
кеш первого уровня скорее всего. Чтобы не пересоздавать, используется один и тот же EntityManager. Так? Откуда берется таймер и откуда он берет EntityManager? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 21:34:01 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Blazkowiczкеш первого уровня скорее всего. Чтобы не пересоздавать, используется один и тот же EntityManager. Так? Откуда берется таймер и откуда он берет EntityManager? +1 тоже хотел написать про кэш первого уровня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2012, 23:18:55 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Добрый день, svenom! > Узнать, где они застревают и ликвидировать эту утечку. Где конкретно это > происходит - ответ ищите в дампе JVM. Кстати, попробовал для этой цели использовать JProfiler. Классная штука- берёшь любой объект (примерно как в JConsole) и говоришь "а почему он живой"- и получаешь путь, из-за которого он ещё в памяти. Утечки искать удобно. Только он, зараза, платный. Интересно- есть у бесплатных такой функционал? -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 08:44:33 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
JDK/bin/jvisualvm.exe Фича называется Find GC Roots по правому клику на объекте в дампе памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 10:05:44 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Eclipse TPTP тоже, говорят, умеет. Но я в него особо не вникал. VisualVM для текущих потребностей хватало с головой. С ним единственный геморрой это отладка Windows Service. Потому что он не видит просто так процессы работающие под другой учетной записью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 10:09:17 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Добрый день, Blazkowicz! > JDK/bin/jvisualvm.exe > Фича называется Find GC Roots по правому клику на объекте в дампе памяти. Это дамп. А та по живому умеет. Но всё одно полезно, спасибо! -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 10:41:47 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraЭто дамп. А та по живому умеет. Но всё одно полезно, спасибо! Что значит "по живому" ? Состояние кучи постоянно меняется. Там нельзя "по живому". А jvisualvm точно так же по живому делает дамп (snapshot) и его можно анализировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 11:01:49 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
denis11111, код приведи. Если ты добавил миллион объектов с разными ID то они все и будут в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2012, 11:32:02 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Blazkowiczкеш первого уровня скорее всего. Чтобы не пересоздавать, используется один и тот же EntityManager. Так? Откуда берется таймер и откуда он берет EntityManager? В GlassFish есть такая настройка как : server-config->EJB Container->Cache Settings - вы про этот кеш? EntityManager используется один, вот ДАО: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. А в бине все работает приблизительно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 11:13:11 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
Судя по всему происходит следующее: 1) У вас есть EM, который инжектится в Stateless бин - пока что все ок 2) У вас есть Stateless Bean, который инжектится в ManagedBean - ну тоже вроде ок 3) НО! У вас ManagedBean является @ApplicationScoped, то есть один на все приложение. Вот тут у нас проблема. В итоге получается, что вы всегда работаете с одним и тем же ManagedBean, в который заинжктен один и тот же StatelessBean, в который заинжектен один и тот же инстанс EntityManager. Это в корне неправильно, так как EntityManager по смыслу - легкий временный объект, он должен быть один на транзакцию, а у вас он один на приложение. Варианты решения: 1) Инжектить не EntityManager, а EntityManagerFactory, из которой получать новый EM - тут я хз, не силен в JPA, может быть так нельзя делать. 2) В ManagedBean не инжектить StatelessBean, а вместо этого получать его через лукап ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 11:22:07 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
У Hibernate есть Stateless Session для подобных задач. Но не факт что оно доступно из JPA. Да и кто-то жаловался что оно не на столько Stateless, на сколько хотелось бы. Использование Swing Timer в EJB приложении это не только странно, но ещё и то что спецификация настоятельно не рекомендует делать. Нужен или EJB таймер, или Quartz, хорошо интегрированый в контейнер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 11:37:56 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
svenom1) Инжектить не EntityManager, а EntityManagerFactory, из которой получать новый EM - тут я хз, не силен в JPA, может быть так нельзя делать. Должно быть можно. Как фикс на быструю руку, если поможет - самое то. Но у меня есть серьезные подозрения что leak может остаться. Так как, у автора, JPA используется в (!sic) Event Dispatch Thread, то контейнер не сможет подчистить EntityManager в неуправляемом потоке. Его можно попробовать закрывать руками. Но сработает ли это, так сразу не скажешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 11:41:10 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
BlazkowiczJDK/bin/jvisualvm.exe Фича называется Find GC Roots по правому клику на объекте в дампе памяти. Ну вот зашел я в нее, подключился к GlassFish, дальше выбрал Profiler, Memory, смотрю. на все обьекты, но там нет ничего про "Find GC Roots". В меня jdk1.7.0. Может я не правильно понял? вменя в логе сервера мелькает такое: "SEVERE: Exception in internal GC" - я так понял это не совсем хорошо... В гугле смотрел, вобще ни одного воспоминания про это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 15:59:10 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
denis11111Ну вот зашел я в нее, подключился к GlassFish, дальше выбрал Profiler, Memory, смотрю. на все обьекты, но там нет ничего про "Find GC Roots". В меня jdk1.7.0. Может я не правильно понял? Memory Profiler - показывает динамику изменений в памяти. Для анализа связей нужно сделать дамп кучи и анализировать содержимое. Это не профилирование. Это анализ кучи. Разные вещи. И зачем это вам? В чем проблема в вашем коде уже указали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 16:05:09 |
|
||
|
ORM и переполнение памьяти
|
|||
|---|---|---|---|
|
#18+
BlazkowiczMemory Profiler - показывает динамику изменений в памяти. Для анализа связей нужно сделать дамп кучи и анализировать содержимое. Это не профилирование. Это анализ кучи. Разные вещи. И зачем это вам? В чем проблема в вашем коде уже указали. Про проблему я понял, пока решаю. Хотел просто понять про что вы говорили. До этого я и не знал что в Java\jdk1.7.0\bin есть какие-то вспомагательные програмки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2012, 16:09:04 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37847291&tid=2131497]: |
0ms |
get settings: |
21ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
49ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
93ms |
get tp. blocked users: |
3ms |
| others: | 324ms |
| total: | 557ms |

| 0 / 0 |
