2010-12-06 2 views
4

Я пытаюсь понять, как JVM-код выполняется JVM.Понимание жизненного цикла кода Java в JVM сверху донизу

сказать, я пишу это Java-код:

public class Hello { 

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

Это байткодом генерируется (с помощью Eclipse Plugin):

// 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. Какой C++ код вызывается?

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

ответ

2

Есть ли инструмент, доступный для анализа кода Java от доверху (до генерации языка ассемблера)?

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

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

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

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

Followup

За то, что вы пытаетесь сделать (исследуя «эволюцию ЯВУ VM от паскаль VM к JVM.») вы, вероятно, тратить свое время, углубляясь в внутренности в виртуальной машине Java. Вы получите лучшую картину и быстрее, найдя и прочитав научные статьи, статьи и блоги разработчиков по этому вопросу. (Проконсультируйтесь с вашим руководителем.) Если вы обнаружите конкретные моменты, которые недостаточно охвачены литературой ... МОЖЕТ стоить погрузиться в реализацию. Но в этот момент у вас будет лучшее представление о том, что вам нужно искать.

Поверьте мне ... Я сам это сделал.

+0

I я делаю анализ JVM. – zengr 2010-12-06 02:38:43

3

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

-verbose [: класс | дс | JNI]

пример:

java -verbose:jni Hello 

Надеется, что это помогает

Смежные вопросы