>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22044 个阅读者 刷新本主题
 * 贴子主题:  Java虚拟机(JVM)的内存结构 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-27 21:20:06     消息  查看  搜索  好友  邮件  复制  引用

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

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  标灰的是线程公有的内存区域,没有标灰的是线程私有

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

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

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

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  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的常量值等,符号引用包括了:类和接口名,字段名,方法名。

            

----------------------------
原文链接:https://blog.51cto.com/11583017/2467927

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-28 17:21:36 重新编辑]
  Java面向对象编程-->集合(下)
  JavaWeb开发-->自定义JSP标签(Ⅰ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->Java网络编程入门
  精通Spring-->通过Axios访问服务器
  Vue3开发-->创建综合购物网站应用
  为网站代码块pre标签增加一个复制代码按钮代码
  详细介绍float和double类型的区别
  Java虚拟机安全性-class文件检验器
  Java小白们的练手大餐:100道编程题面试题精讲(最新推出)
  好消息:《精通JPA与Hibernate:Java对象持久化技术详解》出...
  Java Optional 解决空指针异常总结
  [讨论]书中多线程章节的图示有误?
  邀请您一起来祝福和祈祷,祈愿疫情早日消除,平安吉祥
  使用javaNIO实现C/S模式的通信
  Java设计模式:状态模式
  5个非常有挑战性的Java面试题
  史上最全正则表达式合集(马上收藏)
  通过Java读取Excel数据
  Java中用动态代理实现标准的DataSource数据源连接池
  java零基础入门-面向对象篇 抽象类
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。