Что такое кадр в команде jstack

Я пытаюсь понять команду Java jstack, просматривая онлайн-документ для jstack, где говорится:

jstack выводит трассировку стека Java потоков Java для заданного процесса Java, основного файла или удаленного сервера отладки. Для каждого фрейма Java печатаются полное имя класса, имя метода, 'bci' (индекс байтового кода) и номер строки, если они доступны. С параметром -m jstack печатает как Java, так и собственные кадры всех потоков вместе с «pc» (счетчик программ). Для каждого собственного фрейма печатается ближайший собственный символ к «pc», если он доступен. Искажённые имена C++ не разбираются. Чтобы упростить имена C++, выходные данные этой команды могут быть переданы в c++filt.

У меня есть некоторые сомнения, пожалуйста, помогите мне понять эту команду.

1) Основной файл - это просто имя файла, в котором я хочу распечатать трассировку стека, или это другое? Что такое удаленный отладочный сервер и как мы можем его использовать или настроить?

2) Что такое Java Frame в этом контексте и что такое собственный кадр потока?

3) Я узнал о счетчике программ ранее, когда изучал микропроцессоры, но есть ли такое же концептуальное приложение и для Java?

4) Что означает ближайший родной символ к ПК? Кроме того, как С++ используется в Java, я никогда не сталкивался с С++, когда изучал Java.

Уточните, пожалуйста, заранее спасибо.


person Chaitanya    schedule 22.02.2014    source источник
comment
Фрейм — это стек. Фрейм — это хранилище, выделенное для представления экземпляра вызова метода. Он содержит параметры, локальные переменные для метода, адрес возврата и т. д. Таким образом, собственный фрейм, очевидно, представляет собой фрейм стека, выделенный для собственного метода (в отличие от метода Java).   -  person Hot Licks    schedule 22.02.2014


Ответы (1)


  1. Файл ядра — это дамп ядра работающей (или ранее работавшей) Java-программы, обычно после ее сбоя или после того, как вы ее убили. jstack может либо подключаться к работающей программе, либо читать из дампа ядра.

  2. Фрейм — это состояние, связанное с вызовом функции. Каждый раз, когда вы вызываете функцию, появляется новый фрейм, содержащий локальное состояние этой функции (например, локальные переменные). Кадры образуют стек: вызов функции помещает новый фрейм в стек, а возврат из функции выталкивает этот фрейм из стека, и вы продолжаете в фрейме ниже, который принадлежит вызывающей стороне. Верхний фрейм содержит данные, к которым текущая точка выполнения программы имеет прямой доступ. Концептуально фреймы похожи на «области действия» в языках программирования с блочной структурой.

  3. Виртуальная машина Java — это тоже машина, и у нее есть счетчик программ. Это просто не то, что вы можете потрогать руками или пролить кофе.

  4. Поскольку JVM является виртуальной, она фактически выполняется реальным машинным кодом, который называется «собственным». Таким образом, у вас есть такое же полное представление о фреймах, вызовах функций и точках выполнения снова для нативного кода.

person Kerrek SB    schedule 22.02.2014
comment
Большое спасибо за разъяснения. Значит, в документах говорится, что C/C++ — это нативный код? Подскажите, пожалуйста, что значит натив и зачем он нужен в Java? Это может быть простой вопрос, но, пожалуйста, помогите мне понять. - person Chaitanya; 23.02.2014
comment
Да, нативный код обычно пишется на C или C++, а сама JVM является нативным кодом (и вы также можете выполнять предоставленный пользователем нативный код через JNI). Это необходимо, потому что JVM — это всего лишь виртуальная машина, поэтому ее нужно где-то реализовать! - person Kerrek SB; 23.02.2014