Java-приложение с большим количеством проблем с памятью - PullRequest
0 голосов
/ 17 сентября 2010

Я написал довольно сложное Java-приложение, которое выполняет много вычислений на основе данных о ценах с рынков в режиме реального времени, и, посмотрев на диспетчер задач в Windows, эта присоска получает около 1MEG каждые 30 секунд, а производительностьвсе в порядке, пока он не приблизится к пределу памяти около 300MEG, а затем g-collector действительно заработает и увеличит мой процессор примерно до 50%, а производительность пользовательского интерфейса быстро снижается по сравнению со всем, что я написал, пока это звучит так, как будто у меня есть некоторые проблемыкод происходит потому, что природа моей программы интенсивно использует процессор, но по своей конструкции хранит очень мало данных в памяти.

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

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010
  1. Определите некоторые разумные цели производительности (использование памяти, пропускная способность, задержка).
  2. Составьте несколько повторяемых тестов производительности, чем ближе вы сможете получить их к реальным сценариям, тем лучше.
  3. Завладей хорошим профилировщиком.Я пользуюсь YourKit с большим успехом, профилировщики Netbeans и Eclipse тоже неплохие.Большинство приличных профилировщиков смогут определять использование памяти, ГХ и точки доступа к производительности.
  4. Идентифицировать основных виновников и начинать устранять проблемы, начиная с TOP списка.
1 голос
/ 17 сентября 2010

Проверьте VisualVM. Он находится в текущем каталоге bin JDK как jvisualvm. Если у вас нет утечки памяти, использование кучи должно уменьшиться при запуске сборщика мусора, и вы можете увидеть, какие объекты могут удерживать память, рассчитав оставшиеся размеры объектов в куче.

http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html

0 голосов
/ 18 сентября 2010

Как говорят другие, используйте профилировщик, чтобы найти что потребляет память.

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

Кроме того, если вы хотите предложить GC очистку, попробуйте следующее:

System.gc ();
System.runFinalization ();

Опять же, это всего лишь предложение для gc; но я обнаружил, что это действительно помогает, если вы запустите после , многие объекты выйдут из области видимости.

Наконец, вы можете настроить аргументы vm. Есть настройки для минимального / максимального размера кучи. Если это критическое приложение, установите его на то же самое и установите его высоким (таким образом, он не должен продолжать выделять / освобождать - он просто захватывает один большой кусок при запуске). Это не исправление, просто обходной путь.

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