Не могу сбросить кучу на процесс Java
У меня есть процесс 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 ответа
В чем может быть проблема? Можно ли это решить без перезапуска процесса (возможно, ошибка исчезнет после перезапуска, поэтому я хочу избежать этого).
С риском констатировать очевидное...
Если вы не можете соединиться с отладчиком из-за того, что открыто слишком много соединений, это, вероятно, также является причиной ошибки, которую вы пытаетесь найти.
Попробуйте использовать утилиту уровня ОС, чтобы узнать, какие файлы / сокеты / и т. Д. Открыт в данный момент. Что вы даете подсказки, чтобы сказать, с чего начать. Если этого недостаточно, ищите в своей кодовой базе все места, где открыты файлы / сокеты, и изучите их, чтобы убедиться, что они имеют вложение try / finally
это всегда будет закрывать файл / сокет.
Можете ли вы использовать visualvm от Sun 6 JDK для подключения? Он использует другой метод и позволяет многому научиться - что может быть достаточно - но не является отладчиком.
Для Sun Jvm: Вы можете попробовать новый
HotSpotDiagnostic().dumpHeap("d:\\HeapDump1",true);
Если класс HotSpotDiagnostic не виден во время компиляции, тогда Вы можете скопировать файл rt.jar с файлом HotSpotDiagnosticMXBean.class в другое место. Обратитесь к скопированному банку в пути сборки, используя "Добавить внешний банку". Это позволяет вам создавать Объект и получать дамп кучи.