一问三不知之初识JVM

JVM

1. JVM是什么

1.1 JVM概述

  • JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机。
  • jvm是运行在操作系统之上的,与硬件没有任何关系。
  • JVM全称为 Java virtual machine ,即Java虚拟机。

在这里插入图片描述

1.2 JVM跨平台及原理

Java语言的一次编译,处处运行 ,即java的平台无关性是因为java虚拟机的平台有关性,不同的操作系统或平台,java虚拟机是不一样的,就比如腾讯开源的、免费的、基于 OpenJDK 的发行版本,并且受腾讯长期支持(LTS)和季度更新的Tencent Kona JDK只支持linux平台,没有Windows系统的版本,Java程序经过编译器编译成.class文件,class文件再经过java虚拟机翻译成机器语言,在计算机中运行。JVM就是在java代码和计算机的中间平台,JVM从软件层面屏蔽了底层硬件、指令层面的细节让Java兼容各种系统。

java平台无关性

2. JVM的内存结构

2.1总述

在这里插入图片描述

方法区和堆是线程共享的,栈帧,本地方法栈,程序计数器是线程私有的,每一个线程都有自己的栈帧,本地方法栈,程序计数器。

2.2 Java堆(Heap,线程共有

Java堆为线程共享区域,主要用于存放对象实例,是GC机制主要管理区域,因此也叫GC堆。Java堆对其中对象进行了分代管理,分为新生代和老年代。如果堆中剩余内存不够分配,将抛出OutOfMemoryError异常。

2.3 虚拟机栈(JVM Stack,线程私有

虚拟机栈和普通栈一样都是FILO(先进后出)的,只能对栈顶元素进行操作。栈中存储元素为栈帧,每个方法在执行时都会创建一个栈帧。栈帧中包含 局部变量表、操作数栈、动态链接 和 方法返回地址 。当虚拟机栈不满足内存分配需求,会抛出StackOverFlowError和OutOfMemoryError异常。

  • 局部变量表:用于存放方法参数和方法内部定义的局部变量,以变量槽(Slot)为单位。

  • 操作数栈:类似汇编语言中进行数据操作使用的自定义栈,用于存储操作的内容。

  • 动态链接:静态链接指的是在类加载(解析)阶段将符号引用转为直接引用,即给出地址,而动态链接指的是在运行期间将符号引用转为直接引用(地址),类似于汇编语言中的间接寻址方式。

  • 方法返回地址:指令执行完毕后返回的地址,也即方法调用字节码指令处下一条字节码指令地址,方法调用和返回类似汇编中CALL指令和RET指令。

2.4 方法区(Method Area,线程共有

此区域为各个线程共享的内存区域,用于存储 类信息、静态变量、常量和即时编译代码。方法区中有块区域称为运行时常量池(Runtime Constant Pool),用于存放编译器生成的符号引用和字面量(值本身,String值“ABC”,int值 3 等)。 Java的动态性特征使得不要求常量一定在编译时产生,运行期间尝试新的常量也会加入池中。当方法区无法满足内存分配需求时,抛出OutOfMemoryError。

运行时常量池中内容:
①字面量包括final修饰的常量、基本数据类型的值和字符串
②符号引用包括类和接口全限定类名、方法名和描述符 及 字段名和描述符

2.5 本地方法栈(Native Method Stack,线程私有

此部分内存空间为线程私有的,此栈是为了调用一些非Java语言的方法,即Native方法,此方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。例如垃圾回收System.gc()即为native修饰的方法。

2.6 程序计数器(Program Counter Register,线程私有

此部分内存空间也是线程私有的,程序计数器主要用来指示当前指令执行到字节码指令的行号,类似汇编语言中指令前面的行号,通过行号可定位指令位置,从而实现分支、循环、跳转等功能。此区域一般不会产生OutOfMemoryError的情况。

文章部分内容引用 https://blog.csdn.net/weixin_41485724/article/details/105454703

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值