从"hello world"的执行过程讲起

在学习Java时大部分人写到的第一个程序是 ”hello world“ ,那么它的运行过程细节是怎么样的呢?
代码如下:

package com.ydx;

public class Hello {

  public static void main(String[] args) {
     System.out.println(“hello world”);
  }
}

编译和执行下

D:\workspace\JavaBase\src\com\ydx>javac Hello.java

D:\workspace\JavaBase\src\com\ydx>cd ../..

D:\workspace\JavaBase\src>java com.ydx.Hello
hello world

java命令启动过程可参见:https://blog.csdn.net/CodeFellow/article/details/76601885

执行java命令后的执行过程大致如下:
1、操作系统启动jvm虚拟机,
2、虚拟机启动完成后开始在系统中查找指定的启动类Hello.class,找到Hello.class文件后将class文件装载到jvm内存(方法区)中, 装载过程为: 加载 -》连接-》初始化 (其中验证,准备,解析 3 个阶段统称为连接)
3、初始化完成,执行main方法
4、 调用System类的静态对象out System中 out 属性定义如下public final static PrintStream out = null;类,jvm检查System类是否已经加载并初始化,没有则加载、连接、初始化 System类 ,在初始化System类的时候 会对System类中的常量类进行加载
5、发现String类还未加载、初始化, 执行String类的加载、连接、初始化并 创建String 对象”hello world” , 该对象被存放到 jvm的 特定区域String constant pool 中。
6、执行PrintStream类的printlnf方法,“hello world”字符串在显示器上输出

public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

7、方法执行完成 jvm对象回收、方法区class回收,jvm关闭
整个 hello world执行完毕

启动的过程大致如此,但在整个执行过程中还需要思考以下几个问题:

1、jvm的类加载器是如何加载Hello.class的,是系统类加载器 、扩展类加载器还是系统类加载器 加载的?
2、经常遇到的问题 String类可以自己重写吗 ? 为什么
3、什么时候会加载初始化String , 非启动类什么时候加载、初始化
4、System中的变量out定义为static final null, out是什么时候实例化的
5、String对象在jvm中是如何存放的--自己实践并参见:https://blog.csdn.net/okyoung188/article/details/55506594
6、Hello.class有没有被实例化 ,它存放在jvm 内存中的什么区域 ,String 对象 和 out对象存放在什么地方
7、类的生命周期是什么样子, jvm的关闭过程

总结

一个简单的hello world ,深入的去思考会发现很多问题,撇开jvm内核不说,我们需要知道jvm 源于类的加载、初始化、实例化、生命周期等,jvm对String的特殊处理,jvm的内存结构等等, 由于篇幅有限以上问题会在以后博客中一 一解答,文章中存在的问题也欢迎指正,谢谢!

你可能感兴趣的:(从"hello world"的执行过程讲起)