栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM运行时数据区概述和总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM运行时数据区概述和总结

本博文中所讨论的JVM只是自己看书和教程的个人理解,不太严谨,严谨需要另找详细的资料,对细节把控很到位。

本博文环境:

System OS: Windows10 1909
JDK-Version: 1.8.0_202
JVM: Java HotSpot™ 64-Bit Server VM (build 25.202-b08, mixed mode)
IDE: IDEA2021.3

一,前言

内存,毫无疑问是非常重要的系统资源,是硬盘,CPU的中间桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java程序在运行过程中内存的申请,分配,管理的策略,保证了JVM高效而又稳定的运行

本文主要讨论的是JVM的运行时数据区,对Java虚拟机在执行Java程序过程中会把他管理的内存化的几个区进行介绍
博主认为,运行时数据区突出的就是运行二字,所做的工作时把一些字节码中的常量,变量,方法调用等等的信息都分布到不同的内存区域去便于管理。把一些必要的数据等等运行条件准备好之后,构成了执行引擎执行的基础。

类似粉刷白墙的大佬,在动手前徒弟要把白浆放到一个桶里,腻子粉,白乳胶等等放到另一个桶里,毛刷备好。最后大佬(执行引擎)开始动手。

二,JVM运行时数据区组成部分

TIPS: 不同的JVM对于内存的划分方式和管理机制存在着部分差异。本博文结合虚拟机规范,去探讨经典的JVM内存布局。

按照博客JVM和JAVA体系结构关系概要总结中 JVM的整体架构的图示中,首先先确定本博文需要讨论的位置,如下图的紫色部分。

我们将上述的图形进行细化,可能更好的了解内部的一些情况:

在后续文章中会对上面几部分进行一个详细的介绍。

三,各个部分介绍 3.1 程序计数器(PC Register)

对于程序计数器完全可以将其理解为和操作系统中的程序计数器是一样的作用,都是用来存放需要执行的指令地址(不同的是JVM虚拟机中的是字节码指令)。和计算机中的PC单元一样,程序控制流的指示器,分支,循环,线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过线程中的轮流切换(即是分配处理器时间),在任何时候一个处理器只会执行一条线程中的指令。因此,在切换之后,对于切换回来的线程需要找到上次“中断”执行的位置,这需要PC Register来记录。很容易理解,PC Register每个线程都有一个,即说明这块内存是“线程私有”的。

3.2 Java虚拟机栈(Java Stack)

JAVA虚拟机栈也是线程私有的,虚拟机栈描述的是JAVA方法执行的线程内存模型。即是每一个方法被执行的过程中,JAVA虚拟机中一个当前正在跑的线程都会同步的创建一个栈帧`(Stack frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法被调用直至执行完毕的过程中,都对应的是一个栈帧入栈和出栈的过程。

3.3 本地方法栈(Native Method Stack)

本地方法栈(Native Method Stacks)与虚拟机栈作用是几乎一样,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
这个本地方法栈中执行的代码可能使用C++等语言进行写的。

3.4 堆(Heap)

Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。毫无疑问,这也是JAVA虚拟机的重点介绍内容之一。JAVA中堆不是线程独有的,而是被所有的线程共享的一块区域。,生命周期几乎就是和整个虚拟机的生命周期一致。堆的唯一目的就是存放对象,几乎所有的对象实例都是在这里划内存的。

同时堆也是垃圾收集器管理的区域,同时也被博文写作“GC堆”。从垃圾回收的角度来看,主流的垃圾回收机制大部分都是基于分代收集理论设计的,比如“老年代”,“永久代”,“伊利园”。将Heap进行这样的细分的目的是为了更好的回收内存,或者是更快的分配内存。但是,退一步说,无论从什么角度来解析,都不会改变JAVA堆的存储内容是实例对象这一共性。

3.5 方法区(Method Area)

方法区也被称为非堆(Non-Heap),和JAVA堆一样, 是各个线程共享的内存区域,不是线程独有的。==用于存储已被虚拟机加载的类型信息,常量,静态变量,JIT编译后的代码缓存等数据.==方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区–样都可以是不连续的。方法区有时候也被称为永久代,

四,总结
  • 方法区,堆空间是所有线程所共享的,但是栈空间,PC寄存器,本地方法区是线程独有的。(即是所有的线程都有一份)。
  • 堆是重点之一,主要在堆中进行的垃圾回收机制更是学习的重中之重。
    参考:

[1]https://blog.csdn.net/u010011737/article/details/88763851
[2] https://blog.csdn.net/u010011737/article/details/88763851
[3] 官方的虚拟机规范
《深入理解JAVA虚拟机第三版》

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号