Понимание жизненного цикла Java-кода в JVM сверху донизу - PullRequest
4 голосов
/ 06 декабря 2010

Я пытаюсь понять, как Java-код выполняется JVM.

скажи, я пишу этот код Java:

public class Hello {

    public static void main(String  args[])
    {
        int i = 42;
        String hello ="World";
        System.out.println(hello + i);
    }
}

Это сгенерированный байт-код (с помощью плагина eclipse):

// class version 50.0 (50)
// access flags 33
public class cmpe296/Hello {

  // compiled from: Hello.java

  // access flags 1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init>()V
    RETURN
   L1
    LOCALVARIABLE this Lcmpe296/Hello; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 7 L0
    LDC "World"
    ASTORE 1
   L1
    LINENUMBER 8 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
   L2
    LINENUMBER 9 L2
    RETURN
   L3
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
    LOCALVARIABLE hello Ljava/lang/String; L1 L3 1
    MAXSTACK = 2
    MAXLOCALS = 2
}

Это единственная информация, которую я получаю о коде Java. Но я заинтересован в отслеживании жизненного цикла этого Java-кода. то есть, когда я определяю: int i = 42, какой метод c ++ реализации JVM (open jdk) вызывается.

Существует ли какой-либо инструмент для анализа кода Java сверху вниз (до генерации ассемблера)?

В частности, мой вопрос:

  1. Как байт-код интерпретируется JVM
  2. Какой код на С ++ вызывается?

Я нахожу материал здесь: Google-код openjdk

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Для предварительного анализа вы можете использовать опцию -verbose при выполнении приложенияпомогает

2 голосов
/ 06 декабря 2010

Существует ли какой-либо инструмент для анализа кода Java сверху вниз (до генерации ассемблера)?

Не в той степени, в которой вы хотите, AFAIK.Просто нет необходимости в таком инструменте, чтобы оправдать усилия по его созданию.

  • Теоретически вы можете создать и запустить JVM, используя отладчик уровня исходного кода C / C ++.Однако я подозреваю, что вам понадобится много времени, чтобы добраться до того момента, когда вы сможете увидеть, что происходит, когда выполняется Java-оператор.

  • Другой альтернативой является выявление JVM.параметры, которые сообщают JIT-компилятору выгружать исходный код, который он генерирует, а затем разбирать собственный код.Но это говорит лишь о небольшой части ответа.

В любом случае, я не понимаю, как вы собираетесь многому научиться, что особенно важно ... если вы не планируетереализовать свои собственные инструменты генерации кода Java.И все, что вы изучаете, может быть эфемерным;то есть устарел, когда появится Java 7.

FOLLOWUP

Для того, что вы пытаетесь сделать (исследуя эволюцию "виртуальной машины HLL от паскальной виртуальной машиныв JVM. ") вы, вероятно, тратите свое время, копаясь во внутренностях JVM.Вы получите лучшую картину и быстрее, найдя и читая научные статьи, статьи и блоги разработчиков на эту тему.(Обратитесь к своему руководителю.) Если вы обнаружите конкретные моменты, которые недостаточно освещены в литературе ... МОЖЕТ быть, стоит погрузиться в реализацию.Но в этот момент у вас будет лучшее представление о том, что вы должны искать.

Поверьте мне ... Я сам делал такие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...