Приложение Java Swing зависает

1

У нас есть приложение Java, которое очень велико и требует слишком много памяти, хотя я устанавливаю начальную и максимальную память с помощью флагов Xm, но иногда он замерзает, и мы получаем OutOfMemoryError через 1-2 минуты (если нам повезет).

Если это произойдет, нам необходимо перезапустить приложение.

Мы запускаем программу с помощью собственного приложения c, которое просто запускает командную строку.

Вопросов

  1. Что делать, если я не устанавливаю флаг Xmx?
  2. Означает ли это неограниченное использование памяти?
  3. Как я могу понять, заморожено ли приложение на C или Java?
Теги:
swing
out-of-memory

2 ответа

7
Лучший ответ

Что делать, если я не устанавливаю флаг Xmx?

Затем JVM по умолчанию использует (как правило, скромный) размер памяти для приложения.

Означает ли это неограниченное использование памяти?

Нет.

Как я могу понять, заморожено ли приложение на C или Java?

Устранение утечки памяти 1.

Обратите внимание, что в вопросе, который я ответил, использовался "выпуск", а не "реализовать". После тщательного рассмотрения, я чувствую, что ответ должен оставаться таким же. Либо "освобождение (память)", либо "реализация (есть проблема)" не будет действительно устранять проблему. Лучше всего решить проблему (утечка памяти).


Как в сторону. Я не думаю, что проблема в коде C, но простой тест (запуск приложения из командной строки) должен проявляться в любом случае. Причина, по которой я думаю, что проблема в коде Java, заключается в том, что OutOfMemoryError обнаруживается (предположительно) полностью функциональным JVM.

Если приложение C. использовал пространство памяти, зарезервированное JVM для себя или приложения. Я предполагаю, что ошибка была бы совсем другой, возможно, в соответствии с JVM internal error..

1. Устранение утечки памяти

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

  • @ChristianKullmann начал его, подчеркнув важность профилирования памяти.
  • @KlasLindbäck последовал за ней с некоторыми превосходными ресурсами, связанными в комментарии.
    • Дамп кучи Java.
      "Один из способов обнаружения утечек памяти - это анализ дампов кучи. Существует несколько способов получения дампа кучи (не включая сторонние инструменты).."
    • Советы и рекомендации для анализа дампов памяти кучи виртуальной машины Java.
      "Дампы памяти - очень полезная функция JVM для анализа содержимого памяти в любой момент времени, но их использование требует некоторого опыта, и в этом посте я расскажу вам несколько советов и трюков, которые я узнал за эти годы, так что, надеюсь, они будут вам полезны ".
  • @mKorbel округлил его с некоторыми типичными проблемами, которые нужно искать:
    * "поиск в коде, если есть close() все:
    • JDBC,
    • FileIO,
    • Разъем,
    • и т.д. и в конце блока, тогда вам очень понравится перекомпонование "*
  • 0
    Спасибо, приятель, но мы просмотрели код миллион раз, чтобы выяснить проблему, но это происходит (2%). С пиковым временем приложение будет использовать около 900 МБ памяти, 200 МБ в режиме ожидания. Я также пытался вызвать неявный сборщик мусора, но не помог.
  • 1
    «... мы пересматривали код миллион раз, чтобы выяснить проблему, но это происходит (2%)». Продолжай смотреть. Если вы не знаете, почему это происходит, это усиливает аргумент в пользу утечки памяти: «Я также пытался вызвать неявный сборщик мусора, но не помог». Нет, не будет. Тот факт, что вы не понимали, что это будет бессмысленно, подчеркивает, что у вас нет большого опыта в решении подобных проблем. Хорошо известно , что JVM будет вызывать GC , когда он чувствует , что это необходимо, и если JVM начинает бежать из памяти, она будет называться.
Показать ещё 4 комментария
2

Запуск приложения с использованием собственного кода C не означает, что вы можете управлять всем использованием памяти параметрами JVM. Попробуйте запустить мониторинг памяти для вашей системы (например, TOP на Linux со сдвигом + m для сортировки памяти) или еще лучше профилировать ваше приложение для памяти.

Попытайтесь получить дамп памяти после запуска приложения (есть некоторые инструменты для профилирования, большинство IDE также предоставляют некоторую функцию), чтобы проверить ваши Java-объекты.

  • 1
    +1 за «профилирование». Попытка решить проблему нехватки памяти в сложном приложении. без профилировщика памяти это все равно что пытаться бороться с одной рукой, связанной за нашей спиной.
  • 0
    Спасибо большое, дорогая, хорошая мысль.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню