JVM内存模型(通俗易懂)

JVM内存模型(通俗易懂)1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。2.jdk、jre、jvm是什么关系?(1)JRE(JavaR

大家好,又见面了,我是你们的朋友全栈君。

1.什么是jvm?
(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。
(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。
(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

2.jdk、jre、jvm是什么关系?
(1)JRE(Java Runtime Environment),也就是java平台。所有的java程序都要在JRE环境下才能运行。
(2)JDK(Java Development Kit),是开发者用来编译、调试程序用的开发包。JDK也是JAVA程序需要在JRE上运行。
(3)JVM(Java Virtual Machine),是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

3.JVM原理
(1)jvm是java的核心和基础,在java编译器和os平台之间的虚拟处理器,可在上面执行字节码程序。
(2)java编译器只要面向jvm,生成jvm能理解的字节码文件。java源文件经编译成字节码程序,通过jvm将每条指令翻译成不同的机器码
,通过特定平台运行。

JVM内存模型(通俗易懂)

4. JVM执行程序的过程

  1. 加载.class文件
  2. 管理并分配内存
  3. 执行垃圾收集
    JRE(java运行时环境)由JVM构造的java程序的运行环,也是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,
    因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。
    JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,
    提供一个完整的Java运行环境,因此也就虚拟计算机。

操作系统装入JVM是通过jdk中Java.exe来完成,
通过下面4步来完成JVM环境:

  1. 创建JVM装载环境和配置
  2. 装载JVM.dll
  3. 初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
  4. 调用JNIEnv实例装载并处理class类。

5. JVM的生命周期

  1. JVM实例对应了一个独立运行的java程序它是进程级别
    a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void
    main(String[] args)函数的class都可以作为JVM实例运行的起点
    b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以表明自己创建的线程是守护线程
    c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出
  2. JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的

6、JVM内存模型

(1)java代码具体执行过程如下图,

JVM内存模型(通俗易懂)

(2)运行时数据区,即jvm内存结构图如下图

JVM内存模型(通俗易懂)

(3)运行时数据区存储了哪些数据?

a) 程序计数器(PC寄存器)

由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,

因此,为了能够使得每个线程都在线程切换后能够恢复在切 换 之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,

否则就会影响到程序的正常执行次序。因此,可以这么说,程序计数器是每个线程所私有的。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,

因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

b) java栈

Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)操作数栈(Operand Stack)

指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、

**方法返回地址(Return Address)**和一些额外的附加信息。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。

JVM内存模型(通俗易懂)

c)本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的

d)堆

Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。

e)方法区

与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,

对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

7、JVM内存溢出的情况

JVM内存模型(通俗易懂)

a) 程序计数器(Program Counter Register)

每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。该内存区域是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。

b)Java虚拟机栈(Java Virtual Machine Stacks)

在Java虚拟机规范中,对这个区域规定了两种异常情况:

1、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

  2、如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

       这两种情况存在着一些互相重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已使用的栈空间太大,其本质上只是对同一件事情的两种描述而已。

在单线程的操作中,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOfMemoryError异常。

而在多线程环境下,则会抛出OutOfMemoryError异常。

c)堆Java Heap

Java Heap是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。几乎所有的对象实例和数组都在这类分配内存。Java Heap是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。

  根据Java虚拟机规范的规定,Java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。   

d)方法区域,又被称为“永久代”,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

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

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

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


相关推荐

  • python递归写法_python递归怎么写

    python递归写法_python递归怎么写1、递归的百度百科定义程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般…

    2022年6月18日
    30
  • 国产Linux系统下替代QQ和微信的不二之选

    国产Linux系统下替代QQ和微信的不二之选在2019年,UOS宣布成立至今,原深度系统得到资金之后,发展速度直线上升,目前已经完全可以使用Deepin系统进行办公和日常使用了UOS是Deepin的专业版,前者收费,后者免费,和红帽一样的运营策略但是,众所周知,在去年QQ迎来了距离上一次更新十年前后的第一次更新,更新效果一如既往的被吐槽,因为真的太敷衍了,而微信至今为止,并未有过真正的Linux平台的cs客户端,有的只是一个残废的网页封装版,所以如果使用国产系统去使用腾讯家族的东西,那将是一种折磨。幸好,互联网新秀字节跳动退出了覆盖全国产.

    2022年5月16日
    72
  • PHP程序员如何突破成长瓶颈(php开发三到四年)

    PHP程序员如何突破成长瓶颈(php开发三到四年)

    2021年10月16日
    44
  • windows怎么设置多用户_windows开启多用户远程桌面

    windows怎么设置多用户_windows开启多用户远程桌面在实际使用我们较多使用的都是windows系统的单用户模式,它意味着当我们登录一个用户的时候如果另外一个用户也在登录,那么就得等待另外一个用户退出后才可以登录我们这个用户,但是实际需求中,我们经常会遇

    2022年8月4日
    18
  • java messagedigest_JAVA MessageDigest(MD5加密等)

    java messagedigest_JAVA MessageDigest(MD5加密等)转自http://blog.csdn.net/hudashi/article/details/8394158一、概述java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如MD5或SHA算法。简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要和散列码请参照《数字证书简介》MessageD…

    2022年6月16日
    27
  • Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小

    Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小Ubuntu20.04虚拟显示器1080P配置一、背景二、配置方法1)安装软件2)添加配置文件3)重启三、效果Reference一、背景通过VNC远程连接Ubuntu系统电脑的图形化桌面时,如该电脑未连接显示器,需配置虚拟显示器。二、配置方法1)安装软件通过终端安装虚拟显示器软件。$sudoapt-getinstallxserver-xorg-core-hwe-18.04$sudoapt-getinstallxserver-xorg-video-dummy

    2022年8月21日
    10

发表回复

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

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