首页 > 系统相关 >JVM内存模型,JVM、JRE、JDK之间的关系,Java程序是如何执行的

JVM内存模型,JVM、JRE、JDK之间的关系,Java程序是如何执行的

时间:2023-09-09 16:02:01浏览次数:40  
标签:JRE Java 字节 虚拟机 内存 JVM 运行

一、什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的简称,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。

JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

二、JVM的内存结构图

JVM内存模型,JVM、JRE、JDK之间的关系,Java程序是如何执行的_Java

方法区和堆是所有线程共享的内存区域;而Java栈、本地方法栈和程序员计数器是运行线程私有的内存区域。

Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

方法区(Method Area),方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

程序计数器(Program Counter Register),程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

JVM栈(JVM Stacks),即Java虚拟机栈(Java Virtual Machine Stacks),与程序计数器一样也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈(Native Method Stacks),与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

三、JVM的常见实现

Oracle(Hotspot、Jrockit)、BEA(LiquidVM)、IBM(J9)、taobaoVM(淘宝专用,对Hotspot进行了深度定制)、zing(垃圾回收机制非常快,到达1毫秒左右)。

四、JVM的优点

4.1 一次编写,到处运行

JVM可以让java程序,一次编写,到处运行,让底层代码和运行环境分离开,编写好一份代码后,不用再次修改内容,只用通过安装不同的JVM环境自动进行转换即可运行,在各种系统中无缝连接。

4.2 自动内存管理,垃圾回收机制

在Java诞生之时,C和C++十分火热,但是这两种语言中没有内存管理机制,都是通过手动操作来进行的管理,非常麻烦。

而Java很好地解决了这个问题,为了处理内存管理这个方面,专门设计了垃圾回收机制,来自动进行内存的管理,极大的优化了操作。

4.3 数组下标越界检查

C和C++还有一个问题是数组下标越界是没有检查机制的,JVM提供了数组下标越界的自动检查机制,在检测到数组下标出现越界后,会在运行时自动抛出“java.lang.ArrayIndexOutOfBoundsException”异常。

4.4 多态

JVM还有一个多态功能,是通过相同接口,不同的实例进行实现,完成不同的业务操作,比如:定义了一个动物接口(里面有一个吃的方法),我们就可以通过这个动物创造小猫(吃鱼),再创造一个狗狗(吃肉)。

好处:

(1)消除类型之间的耦合关系;

(2)可替换性;

(3)可扩充性;

(4)接口性;

(5)灵活性;

(6)简化性;

五、JVM、JRE、JDK之间的关系

JVM内存模型,JVM、JRE、JDK之间的关系,Java程序是如何执行的_JVM_02

5.1 JVM

JVM是Java Virtual Machine的简称,是Java虚拟机,是一种模拟出来的虚拟计算机,它通过在不同的计算机环境当中模拟实现计算功能来实现的。

引入Java虚拟机后,Java语言在不同平台上运行时就不需要重新编译。在其中,Java虚拟机屏蔽了与具体平台的相关信息,使得Java源程序在编译完成之后即可在不同的平台运行,达到“一次编译,到处运行”的目的,Java语言重要的特点之一跨平台,也即与平台的无关性,其关键点就是JVM。

5.2 JRE

JRE是Java Runtime Environment的简称,是Java运行环境,是让操作系统运行Java应用程序的环境,其内部包含JVM,也就是说JRE只负责对已经存在的Java源程序进行运行的操作,它不包含开发工具JDK,对JDK内部的编译器、调试器和其它工具均不包含。

5.3 JDK

JDK是Java Development Kit的简称,是Java开发工具包,是整个Java程序开发的核心。其主要包含了JRE、Java的系统类库以及对Java程序进行编译以及运行的工具,例如:javac.exe和java.exe命令工具等。

六、Java程序是如何执行的

我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通过打包工具把项目打包成 jar 包或者 war 包,放入 Tomcat 等 Web 容器中就可以正常运行了,但你有没有想过 Java 程序内部是如何执行的?其实不论是在开发工具中运行还是在 Tomcat 中运行, Java 程序的执行流程基本都是相同的,它的执行流程如下:

先把 Java 代码编译成字节码,也就是把 .java 类型的文件编译成 .class 类型的文件。这个过程的大致执行流程:Java 源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字符码生成器 ->最终生成字节码,其中任何一个节点执行失败就会造成编译失败;

把 class 文件放置到 Java 虚拟机,这个虚拟机通常指的是 Oracle 官方自带的 Hotspot JVM;

Java 虚拟机使用类加载器(Class Loader)装载 class 文件;

类加载完成之后,会进行字节码效验,字节码效验通过之后 JVM 解释器会把字节码翻译成机器码交由操作系统执行。但不是所有代码都是解释执行的,JVM 对此做了优化,比如,以 Hotspot 虚拟机来说,它本身提供了 JIT(Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译为机器码,这个时候字节码就变成了编译执行。Java 程序执行流程图如下:

JVM内存模型,JVM、JRE、JDK之间的关系,Java程序是如何执行的_Java_03

标签:JRE,Java,字节,虚拟机,内存,JVM,运行
From: https://blog.51cto.com/u_16244372/7419938

相关文章

  • CentOS7.5报java: error while loading shared libraries: libjli.so: cannot open sh
    1.问题描述:CentOS版本:CentOS-7.5-x86_64-DVD-1804jdk版本:jdk-8u161-linux-x64.tar配置jdk时,执行java报错java:errorwhileloadingsharedlibraries:libjli.so:cannotopensharedobjectfile:Nosuchfileordirectory 2.解决方法:发现是CentOS7.5不支持jdk-8u161......
  • 无涯教程-JavaScript - IMSUM函数
    描述IMSUM函数以x+yi或x+yj文本格式返回两个或多个复数的和。当添加复数时,实数和虚数系数分别相加,即找到两个复数a+bi和c+di的和的方程为-(a+bi)+(c+in)=(a+c)+(b+d)我语法IMSUM(inumber1,[inumber2]...)争论Argument描述Required/OptionalInumb......
  • Java自学网站推荐--全网最靠谱
    简介网上有各种Java学习网站,本文推荐的这个Java网站全网最靠谱,质量远超其他所有网站。这个网站是:自学精灵,这是全网最强的Java学习网站,可以直接百度搜索自学精灵,或者访问:自学精灵-IT技术星球。我不喜欢“全网最强”这样的字眼,但本站的内容确实是全网最强!(大家可以多找几个Java网站......
  • 无涯教程-JavaScript - IMSUB函数
    描述IMSUB函数以x+yi或x+yj文本格式返回两个复数的差。减去复数时,实数和虚数系数分别相减,即从复数a+bi中减去复数c+di的方程为-(a+bi)-(c+in)=(a-c)+(b-d)我语法IMSUB(inumber1,inumber2)争论Argument描述Required/OptionalInumber1Thecomplexnumb......
  • java频繁的垃圾回收怎么处理
    频繁的垃圾回收可能是由于内存过度使用或存储管理不当引起的。以下是几种处理频繁垃圾回收的方法:1.增加内存分配:通过增加Java虚拟机的堆大小来提供更多的内存空间,可以减少垃圾回收的频率。可以使用-Xmx和-Xms参数来调整堆大小。2.优化对象的创建和销毁:避免过度频繁地创建和销毁对......
  • Java自学网站推荐--全网最靠谱
    ​简介网上有各种Java学习网站,本文推荐的这个Java网站全网最靠谱,质量远超其他所有网站。这个网站是:自学精灵,这是全网最强的Java学习网站,可以直接百度搜索自学精灵,或者访问:自学精灵-IT技术星球。​我不喜欢“全网最强”这样的字眼,但本站的内容确实是全网最强!(大家可以多找几个......
  • JavaScript-初学
            ......
  • 无涯教程-JavaScript - IMSINH函数
    描述MSINH函数以x+yi或x+yj文本格式返回复数的双曲正弦值。复数的双曲正弦通过以下公式计算-$$\sinh(x+yi)=\sinh(x)\cos(y)-\cosh(x)\sin(y)i$$语法IMSINH(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwantthehype......
  • Java基础——基本数据类型转换
    基本数据类型转换基本数据类型数据类型所占字节取值范围boolean未定false与truebyte1个字节-2^7~2^7-1char2个字节0~2^16-1short2个字节-2^15~2^15-1int4个字节-2^31~2^31-1long8个字节-2^63~2^63-1float4个字节-2^128~+2^128double8个字节-2^1024~+2^1024方法调用规则从低位类型到......
  • 无涯教程-JavaScript - IMSECH函数
    描述IMSECH函数以x+yi或x+yj文本格式返回复数的双曲正割。复数的双曲正割被定义为双曲余弦的倒数,即六(z)=1/cosh(z)语法IMSECH(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwantthehyperbolicsecant.RequiredNotes......