主要想问的是内存初始分配上的。 windows 上执行 exe ,装载器会解析该文件的头信息,确定程序的布局和代码段、数据段、堆栈段的大小,然后根据这些信息来分配合适的内存空间。 jvm 是怎么做的呢? 其它解释器,比如 cpython 、zend 、v8 是怎么做的呢?
jvm 本身也只是操作系统上的一个普通 process 。执行 bytecode 之前,jvm 需要先 bootstrap ,这个过程中会初始化一堆的标准库,main 函数所在的 class 也需要被 load 。另外就是 java thread 的 stack frame 是寄生在 native thread stack 上的
不建议看楼上提到的 深入理解 jvm 虚拟机,这本书的内容都是泛泛而谈,基本都是网上的内容拼凑出来的。尤其是关于 safe region 的部分,是直接翻译的 xiaofeng li 写的 blog 。如果想了解 jvm ,可以看封亚飞的揭秘 java 虚拟机和马智的深入剖析 Java 虚拟机入门。入门之后就只能看源码了
主干过程: 1.Bootstrap:JVM 需要先进行 bootstrap 过程,这个过程中会初始化一堆的标准库,包括 Java 的核心类库; 2.加载主类:在 bootstrap 过程中,JVM 还需要加载包含 main 方法的类。这是因为 Java 程序的执行是从 main 方法开始的,所以 JVM 需要先找到并加载这个类; 3.初始化 Java 线程:Java 线程的栈帧是寄生在 native thread stack 上的,这意味着 JVM 需要在执行字节码之前,为 Java 线程准备好运行环境 抛开过程谈本质: 用数组、自定义 struct 、指针内存模拟 CPU 寄存器、内存。把 class 文件解析后加载到常量池、异常处理表等对应的结构中。然后调用 OS API ( ABI )开辟新的线程来模拟 CPU 工作。