Java 1.7.45: как получить полный дамп кучи процесса вместо усеченного дампа

Я использую команду ниже, чтобы получить дамп кучи

jmap -dump:live,format=b,file=/tmp/heap2.bin <pid>

ВМ выбирает:

-Xms2g -Xmx4g  -XX:+UseG1GC -XX:MaxGCPauseMillis=1500 
-XX:G1HeapRegionSize=2 -XX:+PrintFlagsFinal -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 

But this command generates 300+ MB bin heap dump file for process running with 1.2 GB memory (в столбце RES команды top показано 1,2 ГБ памяти)

EDIT: я удалил параметр :live после предложения @kdgregory, но дамп кучи не создается из-за проблемы G1GC (связанный вопрос SE: Ошибка дампа кучи Java с командой jmap: преждевременный EOF)

Мои запросы:

  1. Как получить полный дамп процесса с помощью других алгоритмов GC, таких как CMS?

  2. Как получить дамп кучи вместе с памятью PermGen? (permstat из командной строки для меня бесполезен). Меня также интересует анализ ошибки PermGen OutOfMemory.


person Ravindra babu    schedule 03.12.2015    source источник
comment
Удалить live; это в документации   -  person kdgregory    schedule 03.12.2015
comment
Один хороший улов. Но как пропустить вызов GC?   -  person Ravindra babu    schedule 03.12.2015
comment
Вы говорите, что он запускает GC, когда вы опускаете live? Потому что это лишило бы смысла этот необязательный параметр (т. е. все дампы содержали бы только живые объекты).   -  person kdgregory    schedule 03.12.2015
comment
Даже после удаления опции live размер дампа и размер памяти процесса не совпадают. Дамп мал по сравнению с реальным объемом памяти   -  person Ravindra babu    schedule 13.04.2016
comment
Память, используемая приложением, — это гораздо больше, чем просто объекты, находящиеся в куче в данный момент.   -  person Peter Lawrey    schedule 11.07.2016
comment
Проблема в том, что нет инструмента для анализа данных без кучи. Я использую /proc/{pid}/mem, чтобы увидеть, как отображается память процесса.   -  person Peter Lawrey    schedule 11.07.2016