Jvm的内存结构是理解jvm的基础,下面我用最浅显易懂的语言来分析一下jvm的内存结构,jvm内存分为五大块:

一:程序计数器:程序计数器是用来指示当前线程要执行哪条指令,并且在执行完该条指令后让程序计数器指向下一条指令,直到将程序执行完毕。指令需要靠cpu来执行,在多线程中,多个线程是通过轮流切换分配cpu的时间片而执行的,在切换时需要记录当前执行到了哪条指令以便将来继续执行,每一个线程都需要有自己的程序计数器,所以程序计数器是线程私有的内存

二:虚拟机栈:通常我们把jvm的内存粗略的分为堆和栈,其中的栈指的就是虚拟机栈,虚拟机栈也是线程私有的

虚拟机栈对应的是方法的内存区域,每个方法执行时都会创建一个栈帧,用来存储该方法的局部变量表,操作数栈,动态链接,方法返回地址:

1. 局部变量表局部变量表中存储的是方法的参数和方法中定义的局部变量,在编译期间就为局部变量表分配好了内存空间。局部变量表中存储三种类型的数据:

(1) 基本数据类型

(2) 引用类型:指向一个对象在内存中的地址

(3) returnAddress类型:指向指令的地址(已经很少见了,指向异常处理的指令,现在已经由异常表代替)

2. 操作数栈:当虚拟机执行一些指令的时候会对操作数栈进行入栈或出栈的操作,比如iadd指令将两个数相加,会先将操作数栈中的两个数弹出来(出栈),相加后再压入栈(入栈)中。

3. 动态链接:在运行时常量池中存储了诸如类名,方法名,我们要找到目标类,执行相应的方法就需要用到动态链接,栈帧中有一个指向运行时常量池的引用,通过这个引用可以找到相应的类名和方法名,但是光知道名称是没法执行方法的,需要通过名称找到相应的类和方法在内存中的地址,这个过程就是动态链接。

4. 方法返回地址:当方法执行完以后如果有返回值,就会把这个返回值返回给该方法的调用者,方法的返回就是我们java中用到的return命令。方法返回之后调用者需要继续往下执行就需要知道要执行的地址,该地址就是方法返回地址,它被记录在了栈帧中,当然在发生异常的情况下不会有返回值,要继续执行的地址可以通过异常处理器表来确定。

虚拟机栈可能出现两种类型的异常:

1. 线程请求的栈深度大于虚拟机允许的栈深度会抛出StackOverflowError,(虚拟机栈空间不能动态扩展的情况下)

2. 如果虚拟机栈空间可以动态扩展(目前多数的虚拟机都可以),当动态扩展无法申请到足够的空间时会抛出OutOfMemory异常。

三:本地方法栈:本地方法栈与虚拟机栈的作用是一样的,区别在于虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机执行native方法服务,native方法为本地方法,不是用java语言写的有可能是c或者c++写的,在jdk中就有很多c的代码,就是提供给本地方法来调用的。

四:堆:通常我们把jvm的内存粗略的分为堆和栈,其中的堆就是指它,它是虚拟机中占用内存最大的一块,是被所有线程共享的一块区域,它是用来存放对象实例的。是垃圾收集器管理的主要区域。

五:方法区:方法区也是被所有线程共享的一块区域,它存储的是类信息,常量,静态变量,编译后的字节码等信息。方法区中还有一块区域“运行时常量池“:运行时常量池中存储的是编译期生成的各种字面量和符号引用。字面量相当于Java里常量的概念,比如字符串,声明为final的常量值等,符号引用包括了:类和接口名,字段名,方法名。

0x00000000指令引用的内存不能为written_jvm的内存结构相关推荐

  1. “0X00000000”指令引用的“0x00000000”内存,该内存不能为“read”或“written”

    用Windows操作系统的人有时会遇到这样的错误信息: 「"0X00000000"指令引用的"0x00000000"内存,该内存不能为"read&qu ...

  2. 0x00000000指令引用的内存不能为written_「深入Java虚拟机」Java内存区域与内存溢出...

    内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...

  3. 0x00000000指令引用的内存不能为written_JVM03——对象实例化,内存布局,访问定位...

    从字节码角度看对象的创建过程 public class ObjectTest { public static void main(String[] args) { Object obj = new O ...

  4. 0x00000000指令引用的内存不能为written_变量和内存访问

    计算机世界有一个常识--所有的数据和指令必须经由内存才能进入CPU的寄存器进而被CPU使用,那么我们程序操作的主战场就是内存,内存操作也就顺理成章成为了程序中最高频的操作. 为了节目的效果,我们先来看 ...

  5. 0x00405cad指令引用的“0x00000000”内存。该内存不能为“read”

    内存不能为"read"或"written"的解决方案  有些人运行程序的时候会弹出该内存不能为"read"的错误提示.希望以下文章能对你有所 ...

  6. Apache报错0x6eec38dc指令引用的0x00000000内存。该内存不能为read。

    原因是:配置过httpd.conf,添加了一个指向移动硬盘的网站配置. <VirtualHost *:80> DirectoryIndex   index.html index.php S ...

  7. 0x7c97cdf2指令引用的0x00000014内存。该内存不能为”written

    该内存不能read 或written数值 叙述 0 0x0000 作业完成. 1 0x0001 不正确的函数. 2 0x0002 系统找不到指定的档案. 3 0x0003 系统找不到指定的路径. 4 ...

  8. 玩魔兽争霸无故退出 提示框显示0x21101663指令引用的0x02704acc内存该存不能为read 确定就会终止程序...

    20151002总结:下方法试过,没完全按照说的操作完,觉得有风险且那个read程序执行时间好长的,感觉有点干坏事的意思 ======================================= ...

  9. “0x????????”指令引用的“0x????????”内存。该内存不能为“read或written解决方法

     "0x????????"指令引用的"0x????????"内存.该内存不能为"read或written解决方法 使用Windows操作系统的人有时会 ...

最新文章

  1. NSight Compute 用户手册(上)
  2. Linux xshell窗口批量命令编辑功能(发送键输入到所有窗口)
  3. 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)
  4. python自动化工具哪个好用_微软最强 Python 自动化工具开源了!不用写一行代码!...
  5. RuntimeError: Working outside of request context. This typically means that you attempted to use fun
  6. 用爬虫分析互联网大数据行业薪资情况
  7. hssfcell判断文本类型_ICML 2020 | 显式引入对分类标签的描述,如何提高文本分类的效果?...
  8. C#:JObject、JArray、JProperty、JValue作用
  9. android 之 Dialog
  10. Android 四大组件学习之ContentProvider三
  11. iperf3使用方法说明
  12. 三菱PLC通用快捷键
  13. 官方版WIN10PE如何添加explorer?
  14. 沧州中考计算机考试时间,2019年沧州中考考试时间安排,沧州中考考试科目时间安排表...
  15. v-if报undefined
  16. 路由器 OSPF 动态路由配置
  17. 2017年支付宝账单出来了你花了多少钱
  18. 彻底解决Android系统A-GPS搜不到卫星的问题!亲测!
  19. 利用js制作动态小时钟
  20. “代理服务器出现问题,或者地址有误”解决方案

热门文章

  1. 211高校神级硕士论文刷屏!75行字错了20行!学校回应:导师停招
  2. 马斯克炮轰微软:OpenAI不是你的工具人
  3. 中文版!学习 TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!(附免费下载)...
  4. 线性回归之案例:波士顿房价预测
  5. ACMNO.46 A+B问题 问题描述 输入A、B,输出A+B。(别被数值范围所局限)
  6. Python里面None True False之间的区别
  7. 小时候的小霸王游戏!坦克大战 超级玛丽 魂斗罗 忍者神龟 都有!
  8. 一文打尽目标检测NMS | 精度提升篇
  9. 五分钟搞定VS2017+TensorRT环境搭建
  10. 百度提出PADDLESEG:一个高效的图像分割开发工具