На странице человека написано:
Если данный процесс запущен на 64-разрядной виртуальной машине, вам может потребоваться указать параметр -J-d64
вот и все. Некоторые кучи heap dump включают это, без объяснения причин.
В частности, я пытаюсь выяснить, не указывает ли этот параметр на повреждение кучи (jhat не может их прочитать). Эксперименты вслепую дорогостоящие, так как куча большая, система является живой, и во время работы, когда мне нужна свалка, есть определенные точки.
Фрагмент сообщения jmap
:
λ > jmap
Usage:
jmap [option]
(to connect to running process)
jmap [option]
(to connect to a core file)
jmap [option] [[email protected]]
(to connect to remote debug server)
where
Таким образом, вы видите, что флаг -J
передает аргументы непосредственно в JVM.
Посмотрите справочное сообщение jvm
:
λ > java
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)
where options include:
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available (implies -server, only for x86_64)
Поэтому jmap -J-d64
действительно сообщает jmap
, чтобы запустить java -d64
, используя 64-битную модель вместо 32-разрядной.
Если процесс, в котором выполняется jmap
, не является 64-разрядной JVM, не передавайте аргумент -J-d64
.
, так как я выполнил много jmap
/ jhat
для устранения неполадок
Когда вы говорите, что он поврежден, вы имеете в виду jhat
на самом деле сообщает поврежденный кучи кучи? Или это потому, что ваш куча кучи слишком велик, чтобы читать? jhat
попытается загрузить всю память дампа в память, поэтому вам потребуется как минимум столько свободного места, сколько размер дампа. Для увеличения пространства кучи вам может потребоваться указать -Xmx
на jhat
, а также J-d64
.
Гораздо лучшая альтернатива, которую я использую, - это Eclipse Memory Analyzer Tool , который делает выборочную загрузку кучи памяти скорее чем предустановить все. Это было намного лучше на 6+ ГБ кучи, чем jhat
для меня.