JVM基础储备

JVM从编译到执行

Java程序的执行过程

一个Java程序,首先经过javac编译成 .class 文件,然后JVM将其加载到方法区,执行引擎会执行这些字节码。执行时,会翻译成操作系统相应的函数。JVM作为 .class 文件的翻译存在,输入字节码,调用操作系统函数。

过程如下:Java文件->编译器->字节码->机器码

JVM、JRE、JDK的关系

JVM只是一个翻译,把class翻译成机器识别的代码。开发伙伴在编写代码的时候,需要依赖的类库是在jre中,JVM标准加上实现的基础类库,就组成了Java的运行环境——JRE。

而我们在调试、打包代码时,会应用到JDK,因为JDK提供一些javac(编译代码)、java、jar(打包代码)等,这就是JDK

JVM是一个虚拟化的操作系统,类似于Linux和Windows的操作系统,只是它加载操作系统上,接收到的字节码也就是class,把字节码翻译成操作系统上能够识别的机器码且进行执行。

跨平台性和跨语言性

跨平台性:同一个类,在不同的操作系统上执行,效果相同。

跨语言性:JVM是识别了字节码的,和语言是没有直接关联的。像Kotlin、Scala等也是编译成字节码,执行在JVM上

JVM体系:

 JVM的内存区域

运行时数据区域

定义:在执行java程序过程中会把它所管理的内存划分为若干个不同的数据区域

JVM内存中主要分为堆、程序计数器、虚拟机栈和本地方法栈等;

如果按照与线程的关系也可以划分为:线程私有区域和线程共享(所有线程共享,且只有一份),这里还有一个直接内存,虽然不是运行时的数据区的一部分,但是会被频繁调用。可以理解为没有被虚拟化的操作系统上的其他内存

虚拟机栈

是先进先出的数据结构,在JVM运行过程中用于存储当前线程运行方法所需的数据、指令、返回地址;虚拟机栈是基于线程的,在线程的生命周期中,参与计算的数据会频繁入栈和出栈,栈的生命周期和线程一样。

 栈帧:在每个Java方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈

 在栈帧中大体包括四个区域:局部变量表、操作数栈、动态链接、返回地址

1. 局部变量表:用于存放我们局部变量的(方法中的变量)。首先是一个32位的长度,主要是存放我们的Java的八大基础类型,一般32位可以存下,如果是64位就使用高低位占用两个也可以存下,如果是局部的一些对象,只需要存在地址就行

2. 操作数栈:存放Java方法执行的操作数的,就是一个栈。实质上是JVM执行引擎的一个工作区,也就是方法在执行,才会对操作数栈进行操作,如果代码不执行,操作数栈就是空的

3. 返回地址:正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)

在虚拟机栈的内存也不是无限大的,默认是1M,如果不断进行入栈,但是就是不出栈了,那这个虚拟机就会爆掉

程序计数器:

较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响。程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码地址。由于Java是多线程语言,当执行的线程数量超过CPU核数时,线程之间会根据时间片轮寻争夺CPU资源。如果一个线程的时间片用完了,这个退出的线程需要一个单独的程序计数器,来记录下一条运行的指令。程序计数器也是JVM中唯一不会OOM的内存区域

本地方法栈:

Java虚拟机栈用于Java函数的调用,而本地方法栈是管理本地方法的调用。但本地方法并不是用Java实现的,而是用C。它的服务对象是native方法

方法区:

方法区主要是用来存放已经被虚拟机加载的类相关信息,包括类信息、静态变量、常量、运行时常量池、字符串常量池等。

JVM整体的内存区域图,可以和前面的图进行对比着看

 直接内存:JVM在运行时,会从操作系统中申请一块大的堆内存,进行数据存储;同时还有虚拟机栈、本地方法栈和程序计数器,这块称为栈区。操作系统剩余的内存也就是堆外内存(直接内存),如果使用了NIO,这块区域会被频繁使用,在Java堆内存可以用directByteBuffer对象直接引用并操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值