1.Hello World 字节码分析

说明:本文是我对自己之前学到知识的总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。

本文目标:通过输出hello world,分析java程序在计算机中运行的生命周期,了解程序怎样执行。

2.程序代码如下:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
  • 在命令行窗口输入如下命令
  1. javac Hello.java 编译成功后产生Hello.class的字节码文件
  2. java Hello
  • 可以看到程序输出了Hello World!

3.查看程序运行过程

  • java是面向对象的程序,C语言则是面向过程,在C语言中使用指针,如果操作不当,很可能造成系统崩坏,因为C语言可以直接操作内存,而java把C语言当中复杂的语法以及手动释放内存以及容易造成编码错误的指针都屏蔽掉了,因为java通过JVM来管理内存。
  • JVM在计算机中的位置如下:
  • Java的Hello如何在Windows上运行 java如何运行helloworld_java

  • java编译的字节码文件(.class文件)都运行在JVM虚拟机中,这样java程序员就有更多的精力去开发程序,而不会去担心内存问题。

4.class文件执行流程

  • 首先了解下JVM的数据结构,如下:
  • Java的Hello如何在Windows上运行 java如何运行helloworld_类加载器_02

  • 通过Javac Hello.java生成的Hello.class文件通过类加载器加载到方法区中(元空间独立在内存中,存放运行时常量池信息),为了保证class文件安全,在JVM中使用双亲委派模式进行验证,加载顺为 启动(Bootstrap)类加载器、扩展(Extension)类加载器、 应用程序(Application)类加载器、自定义类加载器。之后我们来分析class文件在类加载器中加载的顺序。
  • Java的Hello如何在Windows上运行 java如何运行helloworld_JVM_03

  • 在类加载器正确加载程序之后,class文件的信息就存放在JVM的方法区中,包含了类的所有信息。之后程序就可以在JVM中运行了,我们通过javap -verbose Hello查看生成的字节码class文件
  • Java的Hello如何在Windows上运行 java如何运行helloworld_java_04


  • Java的Hello如何在Windows上运行 java如何运行helloworld_JVM_05

  • 这些字节码通过字节码执行引擎去执行,之后CPU将程序运行的结果通过地址总线将数据传输到显示设备上显示,具体的程序运行的过程可以参考这篇文章:

总结:java文件是先编译生成class文件后通过类加载器加载到JVM中,class文件中的类名称,方法名称,变量,和一些引用都存放在方法区中;程序运行时,通过将常量池中的字面量值Hello World!压入线程栈当中去执行,通过PrintStream类中的println()方法输出到内存,再由CPU控制程序输出显示。