JVM之内存模型、运行时的数据区域的划分、java的程序计数器作用等

JVM

JVM内存模型

​ 对于Java程序来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样每一个new操作去写对应的delete/free操作,不容易出现内存泄露和内存溢出的问题。正是因为Java程序把内存控制权力交给JVM虚拟机。一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是则那样能够使用内存的,那么排查错误将会是一个非常艰巨的任务。

​ JVM虚拟机在执行Java程序的过程中,会把它管理的内存区域划分为若干个不同的区域,每个区域有各自不同的用途、创建方式及管理方式。有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和销毁,这些共同组成了Java虚拟机的运行时数据区域,也被称为JVM内存模型。

运行时数据区域划分

​ JVM虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。由方法区、堆区、虚拟机栈、本地方法栈、程序计数器五部分组成。

版本差异:

​ JDK1.8之分为:线程共享(Heap堆区、Method Area方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)

​ JDK1.8之分为:线程共享(Heap堆区、MetaSpace方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)

程序计数器(Program Counter Register)

程序计数器:一块比较小的内存空间,是当前线程所执行的字节码的行号指示器。

​ 字节码解释器在解释执行字节码文件工作时,每当需要执行一条字节码指令时,就通过改变程序计数器的值来完成。程序中的分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。

​ 程序执行过程中,会不断的切换当前执行线程,切换后,为了能让当前线程恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,并且各线程之间计数器互不影响,独立存储。

程序计数器主要作用:

​ 1.字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。

​ 2.在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候,能够知道当前线程的运行位置,恢复当前线程的执行。

程序计数器是唯一一个不会出现 OutOfMemoryError的内存区域,它随着线程的创建而创建,随着线程的结束而死亡。

相关推荐
老K的Java兵器库3 分钟前
集合性能基准测试报告:ArrayList vs LinkedList、HashMap vs TreeMap、并发 Map 四兄弟
java·开发语言
Knight_AL7 分钟前
如何解决 Jacob 与 Tomcat 类加载问题:深入分析 Tomcat 类加载机制与 JVM 双亲委派机制
java·jvm·tomcat
枫叶丹414 分钟前
【Qt开发】多元素类控件(二)-> QTableWidget
开发语言·qt
bin915315 分钟前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
哲学七21 分钟前
Springboot3.5.x版本引入javaCv相关库版本问题以及精简引入包
java·ffmpeg
无毁的湖光-Al33 分钟前
日常问题排查-Younggc突然变长
jvm·gc
Aqua Cheng.36 分钟前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
Nebula_g37 分钟前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
努力努力再努力wz39 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表