JVM内存主要分为:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。

  1、程序计数器: 为了线程切换能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。计数器记录的是正在执行的虚拟机字节码指令的地址。

  2、Java虚拟机栈: 每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表(main方法中的对象是对象引用)、操作数栈、动态链接(例如多态就要动态链接以确定引用的状态,符号引用找到符号对应地址方法类似new的对象调用方法)、方法出口等信息。局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和 returnAddress 类型(指向了一条字节码指令的地址)。

  其中 64 位长度的 long 和 double 类型的数据会占用 2 个局部变量空间(Slot),其余的数据类型只占用 1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

  3、本地方法栈: Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

  4、Java 堆: Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”。

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

  一个类中主要有:常量、成员变量、静态变量、局部变量。其中常量与静态变量位于方法区,成员变量位于 Java 堆,局部变量位于 Java 虚拟机栈。

  运行时常量池: 是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

  Java内存模型:每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个线程共享。

请讲一讲你对JVM内存模型的了解?

首先要说一下JVM内存空间分为五部分,分别是:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器

方法区主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小是可以动态扩展的,

堆主要存放的是数组、类的实例对象、字符串常量池等。

Java虚拟机栈是描述JAVA方法运行过程的内存模型,Java虚拟机栈会为每一个即将执行的方法创建一个叫做“栈帧”的区域,该区域用来存储该方法运行时需要的一些信息,包括:局部变量表、操作数栈、动态链接、方法返回地址等。比如我们方法执行过程中需要创建变量时,就会将局部变量插入到局部变量表中,局部变量的运算、传递等在操作数栈中进行,当方法执行结束后,这个方法对应的栈帧将出栈,并释放内存空间。栈中会发生的两种异常,StackOverFlowError和OutOfMemoryError,StackOverFlowError表示当前线程申请的栈超过了事先定好的栈的最大深度,但内存空间可能还有很多。 而OutOfMemoryError是指当线程申请栈时发现栈已经满了,而且内存也全都用光了。

本地方法栈结构上和Java虚拟机栈一样,只不过Java虚拟机栈是运行Java方法的区域,而本地方法栈是运行本地方法的内存模型。运行本地方法时也会创建栈帧,同样栈帧里也有局部变量表、操作数栈、动态链接和方法返回地址等,在本地方法执行结束后栈帧也会出栈并释放内存资源,也会发生OutOfMemoryError。

最后是程序计数器,程序计数器是一个比较小的内存空间,用来记录当前线程正在执行的那一条字节码指令的地址。如果当前线程正在执行的是本地方法,那么此时程序计数器为空。程序计数器有两个作用,1、字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,比如我们常见的顺序、循环、选择、异常处理等。2、在多线程的情况下,程序计数器用来记录当前线程执行的位置,当线程切换回来的时候仍然可以知道该线程上次执行到了哪里。而且程序计数器是唯一一个不会出现OutOfMeroryError的内存区域。

方法区和堆都是线程共享的,在JVM启动时创建,在JVM停止时销毁,而Java虚拟机栈、本地方法栈、程序计数器是线程私有的,随线程的创建而创建,随线程的结束而死亡。

JVM 内存模型面试题目相关推荐

  1. 面试必会系列 - 1.7 JVM 内存模型

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  2. java面试-深入理解JVM(一)——JVM内存模型

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:  1. 程序计数器  2. Java虚拟机栈  3. 本地方法栈  4. 堆  5. ...

  3. java 内存模型面试_Java面试- JVM 内存模型讲解

    经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发.确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些. JVM 的重要性 ...

  4. 面试回答,JVM内存模型/内存空间:运行时数据区

    发布于个人公众号,打开微信,搜索MelodyJerry即可 本文由作者原文 [JVM|内存模型] Java虚拟机的内存模型?也就这7个而已 修改而来,可点击左下角阅读原文. JVM内存模型/内存空间 ...

  5. 面试:JVM内存模型里哪些是线程安全的

    每个线程都拥有自己的工作内存,工作内存是线程私有的. 栈.本地方法栈.程序计数器这三个部分都是线程独占的,线程安全 堆内存和方法区是公共的,非线程安全 JVM 内存模型主要指运行时的数据区,包括 5 ...

  6. 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃 ...

  7. 深入详解JVM内存模型与JVM参数详细配置

    本系列会持续更新. JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内 ...

  8. jvm 参数_一文带你深入了解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. 一.JVM内存结构 由上图可以清楚的看到JVM的内存空间分 ...

  9. JVM内存模型、原理、垃圾回收、调优

    JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...

最新文章

  1. vs2017引入mysql_windows+vs2017+C语言 引入mysql.h对MYSQL数据库的操作
  2. 网络传输数据格式的选择
  3. Python模块包中__init__.py文件的作用
  4. 爬虫训练之--获取错误并将其保存进本地文件
  5. Java中field的覆写_Java中方法的覆写
  6. Pandas 4 个小 trick,都很实用!
  7. php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码
  8. 论文浅尝 | 知识图谱的不确定性衡量
  9. 曾比海底捞还牛,如今关店1200家!肯德基的猪队友,快被中国人抛弃了?
  10. 通信协议之广播---recvfrom 放回客户端的ip地址第一次全为0.0.0.0
  11. ubuntu 安装python3.6后,terminal终端打不开问题
  12. php以及Yii里面的常量收集
  13. 翻译:Swift中的Operations和OperationQueues入门
  14. 线性回归模型异方差解决方法
  15. 磊科路由器信号按键_超简单的磊科路由器重置方法
  16. best-time-to-buy-and-sell-stock
  17. uview中button细边框去除问题
  18. 1024程序员狂欢节,来领当当大额优惠券
  19. Opencv调整运行窗口图片的大小
  20. DDR4内存条电路设计

热门文章

  1. context 浅析
  2. nginx限制指定ip访问
  3. 网页视频播放php拉伸代码,网页在线播放mp4/flv等格式视频方法,CuPlayer(酷播)详细使用方法(附源代码)...
  4. 高性能MySQL(InnoDB)
  5. OUC_软件工程_BLOG1
  6. html中颜色的编码,css颜色编码对照表
  7. 登录、注册页面及后台代码
  8. android mic切换_android手机的Mic对声音的感知 .
  9. 算法练习(7) —— 动态规划 Strange Printer
  10. mysql5.1 优化_7. 优化 - [ MySQL 5.1参考手册 ] - 在线原生手册 - php中文网