jvm内存模型和java内存模型_JVM运行时内存模型综述

JVM内存模型

JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。

78f9a5d48ab92d2bfe8e2181f2dee7d4.png

JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小。

055c4b0710ad06b241fcb3b36993d65c.png

JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区。

2bffdc8d036cc02f066a7835dc7d0407.png

堆的作用是存放对象实例和数组。因为堆占用内存空间最大,堆也是Java垃圾回收的主要区域(重点对象),因此也称作“GC堆”(Garbage Collected Heap)。堆的GC操作采用分代收集算法。

ea1ee38dc73310178b13923f944b4b87.png

堆分为新生代和老年代;新生代又分为:Eden空间、From Survivor(S0)空间、To Survivor(S1)空间。关于Survivor区,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来的对象,和从前一个Survivor复制过来的对象,而复制到老年代的只有从第一个Survivor区过来的对象。而且,Survivor区总有一个是空的。

调节的参数主要有:

-Xms设置堆的最小空间大小。

-Xmx设置堆的最大空间大小。

-XX:NewSize设置新生代最小空间大小。

-XX:MaxNewSize设置新生代最大空间。

图中Virtual区域就是设置参数中最大空间和最小空间之间的差值。

关于老年代,没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。

老年代空间大小=堆空间大小-年轻代大空间大小

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

方法区

方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,方法区与Java 堆一样,是各个线程共享的内存区域。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。

f5ebc50703b0a9031d216251ab913004.png

调节的参数:

-XX:PermSize设置永久代最小空间大小。

-XX:MaxPermSize设置永久代最大空间大小。

-Xss设置每个线程的堆栈大小。

关于永久代(Permanent Generation)和方法区,本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC 分代收集扩展至方法区,或者说使用永久代(PermGen来实现方法区而已。其他JVM虚拟机并没有永久代,jdk8中也没有了永久代的概念。

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

jdk8中,将永久代方法区替换为元数据空间(MetaSpace),MetaSpace占用的内存空间不在JVM内部,而在本地内存空间中。

程序计数器

程序计数器(Program Counter Register)占用内存较小,是线程私有的,它也是唯一没有OutOfMemoryError异常的区域。

程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变计数器的值来选取下一条字节码指令。其中,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成。

a8b4c5a59450c8458cd52c3963f86444.png

Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。

因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

虚拟机栈

虚拟机栈(JVM Stacks)线程私有,生命周期与线程相同。这里存储着方法的局部变量表。

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。

287e56b135675861eed01cb4eb757a8f.png

局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。包括8种基本数据类型、对象引用(reference类型)和returnAddress类型(指向一条字节码指令的地址)。

其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。

如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈作用相似,也会抛出StackOverflowError和OutOfMemoryError异常。

区别在于虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈是为虚拟机使用到的Native方法服务。

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

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

相关文章

getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...

喜欢的可以收藏转发加关注“函数重载”指的是可以有多个同名的函数,因此 名称进行了重载。这两个术语指的是同一回事,但我们通常使用函数重载。可以通过函数重载来设计• 系列函数——它们完成相同的工作,但使用不同的参数列表。重载函数就像…

公关文秘专业要学计算机,文秘相关专业有哪些

文秘相关专业有哪些引导语:想必大多数人对文秘这个岗位都不陌生,那么与文秘相关专业有哪些呢?接下来是小编为你带来收集整理的文章,欢迎阅读!一、中文类专业:中文及相关专业主要包括汉语言文学、汉语言、中…

java seek指针 换行符_Java网络编程探究|乐字节

大家好,我是乐字节小乐,上次给大家讲述了Java中的IO流之输出流|乐字节,本文将会给大家讲述网络编程。主要内容如下:网络 网络分层 IP位置 端口port 网络编程一、 网络 1、概念网络即将不同区域的电脑连接到一起, 组成局…

switch 条件判断_C语言学习第7篇---C语言三大结构之一判断结构

if语句分析1.if语句用于根据条件选择执行语句2.else不能独立存在且总是与它最近的if想匹配3.else语句后可以接其他if语句if语句中零值比较的注意点---bool型变量应该直接出现在条件中,不要进行比较---变量和0值进行比较时,0值应该出现在比较符合左边---f…

计算机应用基础授课提纲,《计算机应用基础》讲授提纲(1).ppt

《计算机应用基础》讲授提纲(1).ppt (49页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.9 积分*第四讲 Windows基础基本操作文件操作控制面板中文操作处理磁盘管理命令提示符*Windows 基本操作桌…

工业机器人演示码垛和卸垛_众多企业购买自动码垛机的原因是什么?

企业为什么要购买自动码垛机呢?难道仅仅是因为它可以自动,让工作变得轻松简单吗?当然不是,如果自动码垛机仅仅能够为企业带来这么点的好处的话,相信是没有企业愿意花大价钱来购买这些自动码垛机的,那么企业究竟是看中了自动码垛…

python 100days github_GitHub - rghwer/Python-100-Days: Python - 100天从新手到大师

Python - 100天从新手到大师 作者:骆昊 最近有很多想学习Python的小伙伴陆陆续续加入我们的交流群,目前我们的交流群人数已经超过一万人,光靠我自己已经无法及时处理小伙伴们的入群申请,更无法及时为大家解答问题。目前我的想法是…

python期末项目书怎么写_自己写了一部书怎么出版

一部书从无到有,包括编写和出版。编写可以自己写,但出版的问题,得靠规定的出版途径来解决。那么,自己写了一部书怎么出版?通常包括两种方法:找出版社直接合作公费出版和找出版公司合作自费出版。自己写了一部书怎么出…

分页请求json数据_Python爬虫入门教程 28-100 虎嗅网文章数据抓取 pyspider

1. 虎嗅网文章数据----写在前面 今天继续使用pyspider爬取数据,很不幸,虎嗅资讯网被我选中了,网址为 https://www.huxiu.com/ 爬的就是它的资讯频道,本文章仅供学习交流使用,切勿用作其他用途。常规操作,分…

bootstrap 导航菜单 折叠位置_教大家如何编写一个网页导航条

导航条简单地说就是对你整个网站模块的简单介绍,你可以直接点击导航条某一个按钮或板块便可进入其相应的界面,如:网页、新闻、贴吧等 。在企业网站上,导航条上常见的有:产品介绍,公司简介,最新产…

python拟合函数_Python-最小二乘法曲线拟合

行文思路:最小二乘法原理介绍 利用 leastsq() 函数进行最小二乘法拟合 拟合注意事项 利用curve_fit 进行最小二乘法拟合 总结: 参考文献 实现代码 一,最小二乘法拟合 最小二乘法是一种数学优化技术,它通过最小化误差的平方和寻找数…

计算机网络提高网络安全意识,提升网络安全意识 共创清朗网络环境

为增强公众网络安全意识,提高网络安全防护技能。近期,徐家营街道围绕“网络安全为人民、网络安全靠人民”活动主题,组织开展了“2020国家网络安全宣传周”活动,保障用户合法权益,维护国家网络安全。一、广泛宣传引导。…

base cap 分布式_干货分享:基于本地消息表的分布式事务解决方案总结

前段时间学习了分布式事务的几种方案,下面主要总结下基于本地消息表实现可靠消息最终一致性的分布式事务方案。1,什么是分布式事务?在传统架构中往往是一个单体架构,一个系统就对应一个war包,然后这个系统也只有一个数…

google protobuf_protobuf 指南

简介安装语言定义特殊指令定义服务JSON 支持选项生成代码基础类型更新 messageGolang 下使用参考简介Protocol Buffers 是 google 出品的一种数据交换格式, 缩写为 protobuf.主要介绍 proto3 版本和 Golang 下的使用.安装protobuf 分为编译器和运行时两部分. 编译器直接使用预编…

计算机无法装补丁,电脑无法安装kb4012212补丁如何处理|电脑无法安装kb4012212补丁的处理方法...

最近,不少用户的电脑都被《永恒之蓝》病毒侵袭,因此微软官方推出了预防补丁 — kb4012212,正常系统只要安装该补丁就能避免电脑遭到伤害。不过,有用户反馈自己遇到了电脑无法安装kb4012212补丁的情况,该怎么办呢&#…

mysql在哪里写代码_[译] 如何写好 Go 代码

原文:https://scene-si.org/2018/07/24/writing-great-go-code/我写了多年的 Go 微服务,并在写完两本关于 (API Foundations in Go 和 12 Factor Applications with Docker and Go) 主题的书之后,有了一些关于如何写好 Go 代码的想法但首先&a…

学画画软件app推荐_路由器管理软件哪个好?6款路由器管理APP推荐_软件评测

无限网络应用越来越广泛,由此应运而生了许多可以蹭网的软件,家里的网速突然变慢了,也许就是隔壁的小哥哥小姐姐在蹭网络,那么如何避免被蹭网?今天小编给各位小伙伴推荐几款路由器管理软件,发现网络变慢了&a…

各个图标的意思_冬奥体育图标设计团队负责人林存真:每一个图标要画100稿以上...

林存真中央美术学院设计学院副院长、北京冬奥组委文化活动部形象景观艺术总监、北京冬奥会体育图标设计团队负责人。12月31日晚,北京2022年冬奥会和冬残奥会体育图标正式发布。在体育图标发布前夕,新京报记者采访了北京冬奥会体育图标设计团队的负责人&a…

delphi制作上下开幕效果_2019中超联赛揭幕战在深圳举行 现场开幕式亮点多多

3月2日晚,2019中超联赛开幕式在深圳大运中心体育场举行。随着中国足协党委书记杜兆才正式宣布2019年中超联赛开幕,以“超精彩”为口号的2019新赛季中超联赛正式打响。本赛季中超联赛是出台“注资帽”、“薪酬帽”、“奖金帽”、“转会帽”之后的第一个赛…

ae正在发生崩溃_AE错误:正在发生崩溃的解决方法,原创问题解决方案

AE在使用过程中,可能会出现一些问题。有的问题是莫名其妙出现。例如刚刚还在正常使用AE软件,下一次再打开的时候就会出现问题。今天给大家说的是如何去解决after effects错误:正在发生崩溃这个问题 。该问题所提供的解决方法为实际操作过,并成功解决。所以才写出来给大家提…