JVM内存模型

本文详细解释了JVM运行时的内存区域划分,包括方法区、程序计数器、虚拟机栈、堆和本地方法栈,以及JVM进程与线程模型,如多线程、内核线程、轻量级进程和用户线程的关系。
摘要由CSDN通过智能技术生成

1 JVM运行时的内存区域划分

JVM运行时内存区域划分成了五大块:方法区、程序计数器、Java虚拟机栈、Java堆内存、本地方法栈。

1.1 方法区

方法区是一个规范,不同的厂商、不同的JDK版本实现不一样。在HotSpot虚拟机中,JDK 1.8之前使用永久代实现方法区,JDK1.8及以后,使用元数据空间实现方法区。

方法区主要存放类加载从class字节码文件中加载的进来的类信息和常量池,类信息包括字段、方法父类等;常量池包括动态常量池和静态常量池,静态常量池是用来保存字面量、符号引用等信息,动态常量池用来保存类加载解析阶段时生成的直接引用等信息。

1.2 程序计数器

程序计数器用于记录字节码指令执行到哪个位置,JVM是支持多线程的,每一个线程都有自己的程序计数器,专门记录当前线程执行到哪一条字节码指令了,在线程上下文切换时用来保存当前线程的执行信息。

1.3 虚拟机栈

在执行Java代码的时候,一定是某个线程在执行。线程在执行方法中的代码时,需要保存方法内部定义的局部变量等数据,这个区域就是Java虚拟机栈。

每个线程都有自己的Java虚拟机栈,线程里面执行方法时会为该方法创建一个栈帧并入栈,栈帧里面有该方法的局部变量表、操作数栈、动态链接、方法出口等数据。当方法执行完毕,就会把对应的栈帧出栈。

1.4 堆

堆是线程共享的区域,堆用于存放代码中创建的各种对象。堆被划分为“新生代”和“老年代”,新生代又被进一步划分为Eden区和Surrvior区,这是垃圾回收相关的知识。

5 本地方法栈

本地方法栈是用于管理native方法的调用,这些native方法一般由c语言实现。

2 JVM进程与线程模型

2.1 JVM进程模型

在操作系统层面,一个JVM实例被视为独立的进程,拥有自己独立的内存空间和执行环境。

2.2 多线程与多核

这是CPU,是一个物理硬件。CPU核心也是一个物理硬件,早期的CPU只有一个核心,现在大多数计算机的CPU是多核的。CPU核心与核心之间的运行相互不受影响,是真正的并行运行。

在这里插入图片描述
Windows可以通过以下命令查看本机的cpu核心数:

# 打开cmd,运行以下命令
# 该命令查看CPU的个数
systeminfo

# 该命令查看CPU的核数
wmic
cpu get NumberOfCores

在这里插入图片描述
在这里插入图片描述

内核线程(Kernel Thread, KLT)是直接由操作系统内核支持的线程,由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。一般一个核心对应一个内核线程,比如单核处理器对应一个内核线程,双核处理器对应两个内核线程,四核处理器对应四个内核线程。

一个核心在同一时刻只能执行一个内核线程,但不代表只能执行某个固定的内核线程,内核线程可以在不同的处理器核心上执行

在这里插入图片描述

随着计算机的发展,出现了超线程技术(Hyper-Process, HT),它可以将一个物理处理器核心模拟成两个逻辑处理器核心,对应就是两个内核线程。所以现在的电脑一般是双核四线程、四核八线程,八核十六线程。

在这里插入图片描述
超线程技术就是通过特殊的硬件指令,把一个物理芯片模拟成两个逻辑处理器核心,让单个物理处理器都能使用线程级并行运算,进而兼容多线程操作系统和软件,减少CPU闲置时间,提高CPU的运行效率。所以,在操作系统中看到的CPU数量是实际物理CPU数量的两倍,可以打开任务管理器、性能,查看本机的处理器核心数和逻辑处理器核心数:
在这里插入图片描述
下面是一个双核四线程的处理器,双核代表两个CPU核心,四线程代表能同时并行执行四个内核线程。
在这里插入图片描述

2.3 内核线程、轻量级进程、用户线程

在这里插入图片描述

概念描述
内核线程内核线程是操作系统内核直接支持的线程,它由内核的线程调度器对内核线程进行控制和分配。
LWP轻量级线程(LWP)是一种由内核支持的用户线程。LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的。LWP的许多操作都要进行系统调用,因此效率不高。
用户线程这里的用户线程指的是完全建立在用户空间的线程库。用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。用户线程的操作是极其快速的且低消耗的。

2.4 JVM线程模型

进程,轻量级进程,内核线程,用户线程的区别关系
JVM线程模型

JVM的线程模型在Java规范中并没有要求用哪种方式实现:

  • 在JDK1.2以前,是使用一种叫绿色线程的用户线程实现的。绿色线程是指由线程创建、调度、销毁完全由JVM实现,不依赖本地操作系统,也叫多对一模型。
  • 在JDK1.2及以后,采用的是内核线程来实现Java线程。内核线程(Kernel Thread, KLT)是直接由操作系统内核支持的线程,由操作系统内核的线程调度器对内核线程进行控制和分配。程序一般不会直接使用内核线程,而是使用一种更高级的接口,即轻量级进程(Light Weight Process,LWP)。每个用户线程都有一个内核线程与其对应,所以也叫做一对一线程模型。
线程模型用户线程与内核线程关系用户线程与LWP关系
一对一每一个用户线程都对应一个内核线程每个用户线程都对应一个LWP
多对一多个用户级线程映射到一个内核线程所有用户线程共享一个LWP
多对多多个用户线程可以映射到多个内核线程多个用户线程可以映射到一个或多个LWP

LWP与内核线程始终是一对一的关系。
我们所说的线程模型是指用户线程与内核线程的对应关系。

一对一模型:
在这里插入图片描述
多对一模型:
在这里插入图片描述

多对多模型:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值