JVM – 内存模型

JVM – 内存模型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的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows 安装vagrant reload 失败; No Virtualbox Guest Additions installation found.[通俗易懂]

    windows 安装vagrant reload 失败; No Virtualbox Guest Additions installation found.

    2022年2月19日
    51
  • PCEP 协议学习笔记

    PCEP 协议学习笔记RFC5440章节:PCReq消息响应PCC发送的PCReq的

    2025年9月30日
    3
  • pki密码技术_PKI体系管理

    pki密码技术_PKI体系管理HTTPS的诞生可先参考网络协议、HTTPS协议等文章明文传输对称加密“加密”和“解密”使用【相同的】密钥,如果密钥可以安全的传输,那么消息也应该可以安全的传输。非对称加密上述非对称加密与对称加密效果基本一样,如果公钥可以安全的传输,那么消息也应该可以安全的传输,接下来看看被劫持的情况。窃听者可以伪造服务器的公钥与客户端通讯,客户端以为是跟服务器通讯,其实是与窃听者在通讯。无论是对称加密还是非对称加密,都遗留了一个问题没有解决,那就是如何证明我们访问的网站就是我们

    2022年8月22日
    6
  • PS2手柄-1「建议收藏」

    PS2手柄-1「建议收藏」相关定义Comd[2]={0x01,0x42};存储了两条指令码,分别是开始指令和请求数据指令。Data[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};数据存储数组,初始全为0。MASK[16]={PSB_SELECT,PSB_L3,PSB_R3,PSB_START,PSB_PAD_UP,PSB_PAD_RIGHT,PSB_PAD_DOWN,PSB_PAD_LEFT,PSB_L2,PSB_R2,PSB_L1,PSB_R1,PSB_GREEN,P

    2022年6月11日
    37
  • getElementById怎么调用

    getElementById怎么调用getElementById怎么调用浏览次数:1414次悬赏分:0|解决时间:2011-4-2818:27|提问者:匿名最佳答案首先都有一个Document对象然后你就可以借这个方法来引用网页文件中各个标签的属性了,当然这个被你引用的标签必须具有ID属性;比如,上面那个标签img就具有ID属性,那么我想获取他的图片地址,可以这么用Document.get

    2022年7月15日
    26
  • 用ASP实现简单的繁简转换

    用ASP实现简单的繁简转换

    2021年11月15日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号