【Java】JVM简析以及Java内存模型

【Java】JVM简析以及Java内存模型

1.操作系统

提到操作系统,想到的肯定是Windows、macOS、Linux这样的名字,确实这些都是当今比较热门的操作系统,而操作系统 的官方定义是:管理计算机硬件与软件资源的计算机程序。它需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务,同时它也提供了一个让用户与系统交互的操作界面,具有并发、共享、虚拟、异步的特征。

2.进程和线程

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;

在当代面向线程设计的计算机结构中,进程是线程的容器。

说到这就不得不提一下什么是线程?

线程是操作系统能够进行运算调度的最小单位。它包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程是独立调度和分派的基本单位。

3. JVM

什么是虚拟机?

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

什么是Java虚拟机(JVM)?

Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。

我们都知道Java有一个非常重要的特点——与平台的无关性,而实现这一特点的关键就在于JVM。一般的高级语言在不同的平台上运行,至少需要编译成不同的目标代码,但Java并不是这样,它不需要进行重新的编译,而是借助JVM屏蔽了与具体平台相关的信息,只需要生成在JVM上运行的目标代码(字节码),就可以实现在不同的平台上不加修改地运行(JVM会把相应的目标代码解释成各平台上对应的机器指令)。

Java语言程序——>(编译生成)目标代码——>Java虚拟机(运行)

一般的高级语言程序——>(编译器/汇编器)目标代码——>不同平台的虚拟机或不同的系统(运行)

当然JVM作为一台抽象计算机(它没有寄存器),但却有着自己的体系结构。在Java虚拟机规范中,分别用子系统、内存区、数据类型以及指令这几个术语来描述。而在内存管理方面,Java运行时涉及到的存储区域主要包括:Java虚拟机栈、本地方法栈、方法区、Java堆、程序计数器以及直接内存等等。

Java虚拟机栈

Java虚拟机栈也称为Java栈,是线程私有的,它的生命周期与线程相同,即随线程而生,随线程而灭,每个方法在被执行的时候,JVM都会同步创建一个栈帧,其中包括局部变量表、操作数栈、动态链接、方法返回地址等,每一个方法被调用的过程,实际上就是栈帧入栈和出栈的过程,

本地方法栈

本地方法栈同样为线程私有,其功能和Java虚拟机栈非常类似。不过其主要是用来管理对本地方法的调用,虽由C实现,但还是为Java方法服务。

方法区

方法区当中主要是保存每一个类的信息。

Java堆

Java堆用于存放所有由new创建出来的对象和数组,所有的线程共享这一块的内容。

程序计数器

程序计数器是一块很小的内存空间,用于存放下一条指令所在单元的地址。为线程私有。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIotuqi7-1626604587946)(https://i.loli.net/2021/07/18/jGxithSBzEmPA1K.png)]

4. Java内存模型

在了解Java内存模型之前,我们先来了解一下什么是内存模型?

内存模型描述了程序中各个变量(实力域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节。

而Java我们都知道它是在JVM上运行的,Java内存模型(简称JMM,全称Java Memory Model)就是一种符合内存模型规范的,规范了线程和内存之间的一些关系且屏蔽了各种硬件和操作系统的访问差异的,保证了Java在各平台下对内存的访问都能一致的机制及规范。

在JVM的内部,Java内存模型将内存分成了两个部分,也就是线程栈区和堆区,如下图所示:

image-20210718162927271

这是Java内存模型在JVM中的逻辑视图。

Java内存模型规定了所有变量都存储在主内存中,每条线程还有自己的工作内存,而线程的工作内存中则保存了这个线程中所需用到的变量的主内存副本的拷贝。此外,线程对变量的所有操作都必须在工作内存中进行,不同的线程间还不能直接访问彼此工作内存中的变量,都需要经过主内存来完成,而JMM就作用于工作内存和主内存进行数据同步的过程。

image-20210718165145050

这之中提到的主内存和工作内存可以类比成计算机内存模型当中的主存和缓存这两个概念来帮助理解。

所以,总的看来,JMM作为一种机制及规范,解决了多线程通过共享内存进行通信时,存在的工作内存中的数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。

还需要注意的是线程中私有的内存以及主内存都只是JVM中逻辑上的内存和主内存,而实际上,根据近段时间是否访问过该数据等因素,无论是工作内存还是主内存中的数据都可能出现在实际硬件当中主存,缓存和寄存器当中的任意位置。

说到这,我们不难发现一个问题,上述提及的共享对象的引入,可能导致当某一个线程想单独对某一数据进行一些操作而不想影响到其他线程,那么作为一个共享的资源这时候应该怎么办?

这就需要JMM的帮助,JMM具有原子性、可见性和有序性三大特性,也存在一些相应的原子操作,可以帮助解决上述问题,比如,

lock(锁定):将主内存变量加锁,表示为线程独占状态

unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量

当然其中更具体地实现细节,还需要进一步地了解JMM的原理,这里附上一张其的工作流程图帮助理解。

image-20210718172042287

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值