• JVM - 内存模型


    # JVM

    JDK版本:1.8

    # 1、JVM内存区域

    JVM在执行应用程序的过程中会将它管理的内存分为若干个不同的区域。其中一部分是线程私有的,一部分是线程共享的。Java内存区域也叫做运行时数据区。JVM内存内存结果如下图所示:

    JVM内存区域


    # 2、Java代码执行流程

    Java代码执行流程

    • Java源码文件通过Java编译器生成字节码文件。
    • 生成的字节码文件通过类加载器进行加载。
    • 然后进行字节码校验器进行字节码校验。
    • 最后通过执行引擎编译成机器指令。其中执行引擎分为两个部分:
      • 翻译字节码:翻译字节码的作用主要是程序的响应时间。对字节码文件进行逐行的解释执行。
      • JIT执行其:主要作用是应用程序的性能。将反复执行的热点代码由字节码文件直接编译成机器指令,缓存在方法区中,直接调用即可。
    • 在操作系统上运行编译生成的机器指令。

    大体步骤就是高级编程语言通过编译器编译成汇编语言,然后再将汇编语言翻译成机器指令,最后在操作系统上运行机器指令。

    操作系统只认识机器指令,即 0 1 0 1。


    # 3、JVM的架构模型

    Java编译器输入的指令流一种是基于栈的指令架构,另外一种指令集架构则是寄存器的指令集架构

    两种架构之间的区别:

    1、基于栈的指令集架构:

    • 设计和实现更为简单,适用于资源受限的系统。
    • 避开了寄存器的分配难题,使用零地址指令方式分配。
    • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器更容易实现。
    • 不需要硬件支持,可移植性更好,更好实现跨平台。

    2、基于寄存器架构:

    • 指令集构架完全依赖于硬件,可移植性差。
    • 性能优秀,执行更加高效。
    • 花费更少的指令去完成一项操作。
    • 大部分情况下,基于寄存器架构的指令集往往都是以一地址指令、二地址指令和三地址指令为主。

    JavaHotSpot使用的是栈的指令架构。


    # 4、JVM的生命周期

    # 4.1、虚拟机的启动

    Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

    # 4.2、虚拟机的运行

    一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时它才执行,程序结束时它就结束。执行一个所谓的Java程序,真真正正在执行的是一个叫做Java虚拟机的进程。

    # 4.3、虚拟机的退出

    虚拟机退出有如下几种情况:

    1、程序正常执行完毕结束。

    2、程序在执行过程中遇到了异常或错误而终止。

    3、由于操作系统错误而导致Java虚拟机进程终止。

    4、某一个线程调用SystemRuntime类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exithalt操作。

    5、除以上之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机进程退出的情况。


    # 5、JVM内存架构

    JVM内存架构

    方法区:存放常量信息,类信息,方法信息。

    • LV(Local Variables):局部变量表。
    • OS(Operand Stack):操作数栈。
    • DL(Dynamic Linking):动态连接。
    • RA(Return Address):方法返回值地址。
    • Interpreter:解释器。
    • Intermediate Code Generator:中间代码生成器。
    • Code Optimizer:代码优化器。
    • Target Code Generator:目标代码生成器。
    • Profiler:分析器。

    GitHub源码地址https://github.com/kapbc/Java-Kapcb/tree/master/src/main/java/com/kapcb/ccc/jvm

    备注:此文为笔者学习JVM的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

  • 相关阅读:
    TCP的三次握手、四次挥手
    fcntl函数 非阻塞轮询
    北大青鸟昌平校区:自己的想法还需要他人左右吗?
    【Educoder作业】C&C++函数实训
    Linux笔记--文件内容的查阅与统计
    广告牌安全传感器怎么用?为城市能起到什么效果?
    macbook本地部署 pyhive环境连接 hive用例
    vue脚手架搭建2022年6月版本(保姆级)
    java疫情期间社区出入管理系统-计算机毕业设计源码21295
    【Linux】题解:Linux环境基础开发工具——进度条
  • 原文地址:https://blog.csdn.net/m0_67394360/article/details/126409370