Не могу сбросить кучу на процесс Java - PullRequest
0 голосов
/ 15 августа 2010

У меня есть процесс Java, который я хочу отладить.Проблема в том, что у него слишком много открытых соединений, поэтому запуск jmap завершается неудачно, потому что он не может подключиться к процессу.Запуск jmap -F приводит к следующей ошибке:

Attaching to process ID 1772, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypeEntryTypeNameOffset" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
        at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:388)
        at sun.jvm.hotspot.HotSpotTypeDataBase.getLongValueFromProcess(HotSpotTypeDataBase.java:369)
        at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:102)
        at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:568)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:332)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
        at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at sun.tools.jmap.JMap.runTool(JMap.java:179)
        at sun.tools.jmap.JMap.main(JMap.java:110)
Debugger attached successfully.

В чем может быть проблема?Можно ли решить эту проблему без перезапуска процесса (возможно, ошибка исчезнет после перезапуска, поэтому я хочу избежать этого).

Ответы [ 3 ]

1 голос
/ 15 августа 2010

В чем может быть проблема? Можно ли это решить без перезапуска процесса (возможно, ошибка исчезнет после перезапуска, поэтому я хочу избежать этого).

С риском констатировать очевидное ...

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

Попробуйте использовать утилиту уровня ОС, чтобы узнать, какие файлы / сокеты / и т. Д. Открыт в настоящее время процессом. Что вы даете подсказки, чтобы сказать, с чего начать. Если этого недостаточно, найдите в своей кодовой базе все места, где открыты файлы / сокеты, и проверьте их, чтобы убедиться, что они содержат try / finally, который всегда закроет файл / сокет.

0 голосов
/ 10 июля 2017

для Sun Jvm: Вы можете попробовать новый

HotSpotDiagnostic().dumpHeap("d:\\HeapDump1",true);

Если класс HotSpotDiagnostic не виден во время компиляции, то Вы можете скопировать файл rt.jar с классом HotSpotDiagnosticMXBean.class в другое место. Обратитесь к скопированному банку в пути сборки, используя «Добавить внешний банку». Это позволяет вам создавать Объект и получать дамп кучи.

0 голосов
/ 15 августа 2010

Можете ли вы использовать visualvm из Sun 6 JDK для подключения?Он использует другой метод и позволяет многому научиться - чего может быть достаточно - но не является отладчиком.

...