java程序中的main方法是如何被调用起来的
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
认知第一点:xxx.java,文件都是要通过javac命令编译成字节码 xxx.class, 然后在通过java来执行class文件。 那这个java 命令到底干了啥? java命令是用c程序编译成的可执行文件, java xxxx, 就可以运行改xxx字节码文件的main方法。 是怎么做到的, 以及我们常说的 main线程又是怎么来的?可以这么想一下 java 后面的命令都是 字符串参数的,java 命令 首先肯定会执行 c程序的main方法,main方法的args就会接收到我们java 命令后面的所有字符串, 之后呢? 在c的main方法里面可定首先要创建jvm,说不定 jvm在 就是一个结构体。 (注意了 这个时候 c的代码可是由 操作系统分配了 进程的主线程在运行这,呃 这里的主线程是一个lwp轻量级进程, 这个进程的pid是和进程一样的);所以jvm是有这个轻量级进程来创建的,现在jvm有了,我们要怎么来调用jxxxx.class的main方法呢?应为java也支持多线程的,所以得由着c层面的代理来进行创建线程,然后回调xxxx.class的main方法。那java层面的thread对象,如何入c创建的操作系统线程进行绑定呢?呃,首先c进行创建线程调用的是linex的底层p_thread方法,还有写操作系统的线程 他不是面向对象的语言, 所以 会由一个 线程描述符id号,ok,现在这个id就是代表着操作系统的原生线程,为了方便使用 jvm得进行包装 成一个osthread对象,用来代表线程id,接着创建javathread,来持有这个osthread, 这也 绑定已经完成了,那现在问题又回到 javathread 怎么和java thread类的对象进行映射, 那肯定是有方法的。映射完成之后 就是 回调 xxx.class的main方法了。
以上为学了码炫课堂 码哥课程的 学习总结, 视频讲得远比这个丰富, 本笔记是自己看完之后的按照自己理解的笔记,慎看。