jvm 在执行程序的第一行字节码之前,会做怎样的准备工作? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gegeligegeligo
V2EX    Java

jvm 在执行程序的第一行字节码之前,会做怎样的准备工作?

  •  
  •   gegeligegeligo 2024-04-19 13:59:11 +08:00 2124 次点击
    这是一个创建于 543 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要想问的是内存初始分配上的。
    windows 上执行 exe ,装载器会解析该文件的头信息,确定程序的布局和代码段、数据段、堆栈段的大小,然后根据这些信息来分配合适的内存空间。
    其它解释器,比如 cpython 、zend 、v8 是怎么做的呢?

    7 条回复    2024-04-19 22:10:51 +08:00
    letianqiu
        1
    letianqiu  
       2024-04-19 15:04:53 +08:00   1
    jvm 本身也只是操作系统上的一个普通 process 。执行 bytecode 之前,jvm 需要先 bootstrap ,这个过程中会初始化一堆的标准库,main 函数所在的 class 也需要被 load 。另外就是 java thread 的 stack frame 是寄生在 native thread stack 上的
    Rickkkkkkk
        2
    Rickkkkkkk  
       2024-04-19 15:17:33 +08:00   1
    有本书很好, 深入理解 jvm 虚拟机

    你的问题都能回答, 包括 main 是怎么被执行起来的, 堆栈如何分配, 方法调用怎么跳转等等
    letianqiu
        3
    letianqiu  
       2024-04-19 17:04:21 +08:00   6
    不建议看楼上提到的 深入理解 jvm 虚拟机,这本书的内容都是泛泛而谈,基本都是网上的内容拼凑出来的。尤其是关于 safe region 的部分,是直接翻译的 xiaofeng li 写的 blog 。如果想了解 jvm ,可以看封亚飞的揭秘 java 虚拟机和马智的深入剖析 Java 虚拟机入门。入门之后就只能看源码了
    R4rvZ6agNVWr56V0
        4
    R4rvZ6agNVWr56V0  
       2024-04-19 20:29:52 +08:00   1
    主干过程:
    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 工作。
    R4rvZ6agNVWr56V0
        5
    R4rvZ6agNVWr56V0  
       2024-04-19 20:31:39 +08:00   1
    VM 的本质就是 C/C++指针和数据结构的 tricky skills 。内存分配和管理是非常大的知识范畴,几句话也说不明白
    luozic
        6
    luozic  
       2024-04-19 21:56:16 +08:00   1
    额,完整的补起来: 可以先看
    1.sicp 计算机程序的构造与结束

    2. 再去编译一下 openjdk 的源码,推荐就用你现在主要用的 openjdk 8 or 17 21 ,去调试一下程序,打一下断点。 这里实际更推荐 实战 Java 虚拟机:JVM 故障诊断与性能优化(第 2 版) 葛一鸣的---这个是一步步非常详细的,不像深入 jvm 那本主要是介绍一个地图

    3.垃圾回收算法手册-自动内存管理的艺术-英-理查德-琼斯

    4. 再就是那些 算法优化案例,arthas jfr 1brc 挑战 ebpf 火焰图 逃逸分析等玩意了
    这部分非常推荐看 openjdk 的部分 blog 还有工具。jitwatch 等。
    luozic
        7
    luozic  
       2024-04-19 22:10:51 +08:00   1
    jvm 现在已经非常复杂了。
    如果只是关注 openjdk---hotspot 系的,
    可以看
    1.JMM jdk 内存模型,

    2. JVM special 文档, jvm specification https://docs.oracle.com/javase/specs/index.html
    =======================================================
    不过你确定你看得下去各个语言 language vm 的 specs 文档,即使是挑着和你问题相关的看,随便一个语言 VM 说清楚你这个问题也是百页英文,还得拉着代码断点调试 看看实现和 specs 的配套情况。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     924 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 22:00 PVG 06:00 LAX 15:00 JFK 18:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86