掌握JVM 运行时数据区,其实不是很难,加薪也是要技巧可言的!!!

一、概念

Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。

而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,

如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。

二、JVM 运行时数据区结构图

1、java虚拟机规范中的结构图

2、java1.8 虚拟机(HotSpot)中的数据区域

image

三、各个区域简介

1、程序计数器

程序计数器,是一块儿较小的内存空间,它可以当作是当前线程所执行的字节码的行号指示器

字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。

每个线程都需要一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。我们称这类内存区域为“线程私有”的内存。

如果线程正在执行的是一个 Java 方法,这个计数器记录的正是正在执行的虚拟机字节码指令的地址;

如果正在执行的是 Native 方法,这个计数器值则为空。

程序计数器,是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。


2、虚拟机栈

虚拟机栈也是“线程私有”的,它的生命周期与线程相同。

虚拟机栈描述的是 Java 方法执行的内存模型

每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表操作数栈动态链接方法出口等信息。

每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

常常说的 “堆” 和 “栈” 中的 “栈”就是指 虚拟机栈,或者说是虚拟机栈中局部变量表部分。

局部变量表存放了编译期可知的各种基本数据类型(byte,short,int,long,float,double,char,boolean),对象引用(reference),returnAddress 类型(指向了一条字节码指令的地址)。

局部变量表所需要的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

在 Java 虚拟机规范中,对这个区域规定了两种异常状况:

如果线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverFlowError 异常;

如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出 OutOfMemoryError 异常。

3、本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是类似,他们之间的区别不过是虚拟机栈为虚拟机 Java 方法(也就是字节码)服务,

而本地方法栈则为虚拟机使用到的 Native 方法服务。

在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。

甚至有的虚拟机(如:Sun HotSpot虚拟机)直接把本地方法栈和虚拟机栈合二为一。

与虚拟机栈一样,本地方法栈区域也会抛出 StackOverFlowErrorOutOfMemoryError 异常。

4、堆

对于大多数应用来说,Java 堆是 Java 虚拟机所管理的内存中最大的一块儿。

Java 堆是被所有线程共享的一块儿内存区域,在虚拟机启动时创建。

此内存区域的唯一母的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

Java 堆是垃圾收集器管理的主要区域,因此也被称作 “GC” 堆。

从内存回收的角度来看,由于现在收集器基本采用分代收集算法,所以 Java 堆中还可以细分为:新生代老年代

再细致一点的又** Eden 空间**、From Survivor 空间To Survivor 空间

Java 堆中的内存空间 既可以实现成固定大小的,也可以是可扩展的(通过 -Xmx 和 -Xms 控制)。

如果在堆中没有足够的内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。

5、方法区

方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的** 类信息**、常量静态变量即时编译器编译后的代码等数据。

根据 Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常。

四、Java8中的JVM元空间是不是方法区?

严格来说,不是。首先,方法区是JVM规范的一个概念定义,并不是一个具体的实现,每一个JVM的实现都可以有各自的实现;

然后,在Java官方的 HotSpot 虚拟机中,

Java8版本以后,是用元空间来实现的方法区;在Java8之前的版本,则是用永久代实现的方法区;

也就是说,“元空间” 和 “方法区”,一个是HotSpot 的具体实现技术,一个是JVM规范的抽象定义;

所以,并不能说“JVM的元空间是方法区”,但是可以说在Java8以后的HotSpot 中“元空间用来实现了方法区”。

然后多说一句,这个元空间是使用本地内存(Native Memory)实现的,也就是说它的内存是不在虚拟机内的,

所以可以理论上物理机器还有多个内存就可以分配,而不用再受限于JVM本身分配的内存了。

最后,祝大家早日学有所成,拿到满意offer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不要被约束的意思_俗话说:“娶妻不娶颧骨高,嫁汉不嫁连眉梢”,到底什么意思?...

“世有伯乐,然后有千里马。千里马常有,而伯乐不常有。”——《杂说》 唐韩愈传说春秋时期,有个叫伯乐的人很会选马,他选马的时候,并不需要骑着马真刀真枪地跑几圈,只是看看马的骨相、听听马的嘶鸣就能判断出…

终于来了!微软正式推出 VS Code 测试 API

随着 Visual Studio Code 1.59.0 正式版本的发布,全新的插件测试 API 也从试验版本进入了正式版本。自 2020 年 9 月起至今,经过了将近一年及数次版本迭代的打磨,不管是 API 的功能性还是易用性,与首个预览版本相比都获得了极大的…

MariaDB 10的复制 集群 高可用搭建 大表拆分【持续更新中】

视频地址 http://edu.51cto.com/course/course_id-1691.htmlMariaDB 10培训课程第一部分 复制1.基于GTID方式复制配置及注意事项2.基于表的并行复制3.多源复制(MariaDB 10支持多主一从)4.从库延迟如何找到那条执行慢的SQL5.复制异常处理1062,1032错误处理…

c++歌手大赛系统_计人即讯|第十届程序设计大赛

“第十届程序设计大赛”为激发学生学习计算机语言和科学使用计算机的热情,培养独立思考、勇于创新的探索精神和敢闯会创的意志品格,我院于12月5日13时30分在中主阶教201室成功举办了“第十届程序设计大赛”。本次大赛主要考察选手们应用计算机解决生活中…

限时9.9元 | 快速领取数学建模竞赛备战必备技巧与论文详解!

全世界只有3.14 % 的人关注了青少年数学之旅大家晚上好,随着美赛时间的公布以及大大小小的数学建模竞赛的进行,小天经常可以收到来自很多小伙伴们提出的问题,“竞赛中如何去考虑选题?”、“如何进行思路分析?”、“参考…

项目经理问我Java内存区域模型!急急急

也就这么点吧 Java内存区域主要分为:堆,栈,方法区三大部分 1、堆:是内存区域中最大的部分,所有线程共享,其中存放创建的对象和数组。由于堆是垃圾收集器管理的主要区域,因此也叫GC堆。 2、栈…

设计模式之中介者

中介者模式介绍中介者模式中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。中介者模式顾名思义,可以用我们平时生活中的房产中介去理解…

你的网页加载太慢了怎么办?

客户反映,“网页速度太慢了!!”,怎么办? 这个问题似乎有些难以解决,慢了就是慢了,也许用户使用就是一个56K猫,也许服务器只有256K的带宽,也许是网页设计有问题&#xff…

看了这个逻辑关系图,才更清晰为何不让你随便外出了

全世界只有3.14 % 的人关注了青少年数学之旅看了这个逻辑关系图,才更清晰为何不让你随便外出了。非常时期,爱国、爱家、爱自己,请近期减少不必要的外出,直到官方宣布疫情解除!转载来源:刘小兔爱画画部分素材…

ef 关联依赖属性_基础巩固之:xmlns属性梳理

转载自&#xff1a;https://www.cnblogs.com/osttwz/p/6892999.html<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…

高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水

文章开篇问一个问题吧&#xff0c;一个java程序&#xff0c;如果其中一个线程发生了OOM&#xff0c;那进程中的其他线程还能运行吗&#xff1f; 接下来做实验&#xff0c;看看JVM的六种OOM之后程序还能不能访问。 在这里我用的是一个springboot程序。 /*** author &#xff…

架构 | 聊聊我心中的架构设计观

【架构设计】| 总结/Edison Zhou在各种面试场合&#xff0c;可能都会被问到“你对架构设计的理解”&#xff0c;我也在最近的转正答辩中被技术委员会负责人问到&#xff0c;这里我重新整理一下思绪&#xff0c;聊聊我心中的的架构设计观。1系统的本质是什么&#xff1f;作为一个…

GeneralUpdate 2021.08.14更新公告

GeneralUpdate是基于.net standard2.0开发的一款&#xff08;c/s应用&#xff09;自动升级程序。该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf&#xff0c;控制台应用&#xff0c;winfrom。1.Notice预计会使用Blazor开发GeneralUpdate官网&#xff0c;介…

这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了

全世界只有3.14 % 的人关注了青少年数学之旅最近在广州地铁&#xff0c;有人戴了这种自制的硬核“面罩”&#xff01;广州地铁后来回应说&#xff0c;这些人其实也戴了口罩&#xff0c;否则光戴着桶还是不可以进地铁的目测这种“全方位防护”效果应该不错网友爆料说&#xff0c…

面试问外观模式???这不就是设计模式里面的吗?我给你上一课吧,面试官

面试问外观模式&#xff1f;&#xff1f;&#xff1f;这不就是设计模式里面的吗&#xff1f;我给你上一课吧&#xff0c;面试官外观模式介绍实现步骤 1Shape.java步骤 2Rectangle.javaSquare.javaCircle.java步骤 3ShapeMaker.java步骤 4FacadePatternDemo.java步骤 5外观模式 …

ab st语言编程手册_西门子PLC编程SCL和LAD谁才是王者?一起讨论一下

现在很多大品牌的中高级 PLC 都支持国际电工委员会 IEC61131 标准中规范的五种编程语言的混合编程&#xff0c;即梯形图&#xff08;LD&#xff09;、结构化文本(ST)、流程图&#xff08;SFC&#xff09;、指令表&#xff08;IL&#xff09;和功能块(FB)。在这五种编程语言中&a…

ASP.NET Core自定义响应内容

问题在业务开发中&#xff0c;对Web API的返回格式有一定要求&#xff0c;需要是定制化的Json结构&#xff0c;用于前端统一处理&#xff1a;{Status : 0,Message: "",Info : xxx }Status表示响应的状态码&#xff0c;0为成功&#xff1b;Message表示错误消息&#x…

这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解

▲ 点击查看从素有“计算机界诺贝奖”之称的图灵奖&#xff0c;距离现在已经走过了半个多世纪。在这50多年间&#xff0c;诞生了几十位顶尖的计算机科学家以及几十项科技成就。从智能设备到5G&#xff0c;从无人车到AI&#xff0c;在计算机的进化版图中&#xff0c;计算机从一个…

倾情研发十年记

写在亚洲研究院成立十周年、亚洲工程院成立五周年之际今天是微软亚洲研究院成立十周年的日子&#xff0c;微软亚洲工程院也刚刚度过它的五周岁生日。在这个特殊的时刻&#xff0c;回望这些年来全心投入研发的日子&#xff0c;我心中充满了自豪和对未来的期待。十年前&#xff0…

华为二面!!!被问常用API,这也太偏门了吧,我秀了一波hhhh~

华为二面!!&#xff01;被问常用API&#xff0c;这也太偏门了吧&#xff0c;我秀了一波hhhh~常用API一、API概述二、Scanner类代码三、Random类代码四、* ArrayList类**存储基本数据类型**代码五、匿名对象昨天我去了华为面试&#xff0c;问我常用API&#xff0c;我以为我被搞到…