JVM и использование памяти - сервер JRun не использует полное выделение PSPermGen? - PullRequest
4 голосов
/ 20 августа 2010

Я пытаюсь понять, почему сервер ColdFusion 9 (JRun) выдает следующую ошибку:

java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?

Аргументы JVM таковы:

-server -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC -

Я имелjconsole работает, когда произошел дамп, и я пытаюсь согласовать некоторые числа с параметром -XX:MaxPermSize=192m выше.Когда JRun умер, у него было следующее использование памяти:

Heap
 PSYoungGen      total 136960K, used 60012K [0x5f180000, 0x67e30000, 0x68d00000)
  eden space 130624K, 45% used [0x5f180000,0x62c1b178,0x67110000)
  from space 6336K, 0% used [0x67800000,0x67800000,0x67e30000)
  to   space 6720K, 0% used [0x67110000,0x67110000,0x677a0000)
 PSOldGen        total 405696K, used 241824K [0x11500000, 0x2a130000, 0x5f180000)
  object space 405696K, 59% used [0x11500000,0x20128360,0x2a130000)
 PSPermGen       total 77440K, used 77070K [0x05500000, 0x0a0a0000, 0x11500000)
  object space 77440K, 99% used [0x05500000,0x0a043af0,0x0a0a0000)

Мой первый вопрос состоит в том, что дамп показывает, что PSPermGen является проблемой - он говорит, что общий объем составляет 77440K, но он должен быть 196608K (на основемой аргумент JVM 192 м), верно?Что мне здесь не хватает?Это как-то связано с другим пулом, не относящимся к куче - с кешем кода?

Я работаю на 32-битной машине, Windows Server 2008 Standard.Я думал об увеличении аргумента PSPermGen JVM, но я хочу понять, почему он, кажется, не использует свое текущее распределение.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 20 августа 2010

OOME "out of swap space" возникает, когда JVM запросила у операционной системы больше памяти, и операционная система не смогла выполнить запрос, поскольку все пространство подкачки (диска) уже выделено. По сути, вы достигли общесистемного жесткого ограничения на объем доступной виртуальной памяти.

Это может произойти не по вине вашего приложения или JVM. Или это может быть следствием увеличения -Xmx и т. Д. Сверх возможностей вашей системы для поддержки.

Существует три подхода к решению этой проблемы:

  • Добавление дополнительной физической памяти в систему.

  • Увеличение количества пространства подкачки, доступного в системе; например в Linux посмотрите руководство пользователя для swapon и друзей. (Но будьте осторожны, чтобы отношение активной виртуальной памяти к физической памяти не становилось слишком большим ... или ваша система подвержена "трэшу", и производительность упадет до минимума.)

  • Сокращение количества и размера процессов, запущенных в системе.

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

2 голосов
/ 20 августа 2010

«ChunkPool :: allocate. Out of swap space» обычно означает, что процессу JVM не удалось выделить память для своей внутренней обработки.

Обычно это напрямую не связано с использованием кучи, поскольку самому процессу JVM не хватает памяти. Проверьте размер процесса JVM в Windows. Возможно, вы достигли верхнего предела.

Этот отчет об ошибке также дает объяснение. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5004956

Обычно это вызвано тем, что ваше приложение не освобождает нативные, не Java-объекты, а не Java-объекты в куче.

Некоторые примеры причин:

  • Большой размер стека или много потоков, порождаемых и очищаемых некорректно. Стеки потоков живут в собственной памяти "C", а не в куче Java. Я видел это сам.
  • Окна Swing / AWT создаются программно и не утилизируются, когда они больше не используются. Нативные виджеты, стоящие за AWT, тоже не живут в куче.
  • Прямые буферы от nio не выпускаются. Данные для прямого буфера выделяются собственной памяти процесса, а не куче Java.
  • Утечки памяти в вызовах jni.
  • Многие файлы открыты и не закрыты.

Этот блог оказался полезным при диагностике аналогичной проблемы. http://www.codingthearchitecture.com/2008/01/14/jvm_lies_the_outofmemory_myth.html

1 голос
/ 02 ноября 2010

Проверьте ваш файл setDomainEnv.cmd (.sh). на PermSize будет три разных условия -XX: MaxPermSize = xxxm -XX: PermSize = xxxm. Изменить везде

...