首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中,会把它所管理的内存,划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。

有的区域,随着虚拟机进程的启动而存在;有些区域,则依赖用户线程的启动和结束而建立和销毁。

我们来看一下Java虚拟机运行时的数据区。

程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。什么意思呢?

我们知道,CPU的计算时间是以分片的方式给到每个线程的(换句话说,所谓并行其实本质上还是串行),比如线程A执行到一个地方,CPU将控制权给了线程B,那么线程A重新获得CPU的资源时,如何恢复到刚才执行的地方呢?

这就是程序计数器要干的事了!它能帮助线程A找到刚刚执行的地方,从而继续刚刚的执行。

为了线程切换后能恢复到正确的执行位置,就要求每个线程都需要有个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。所以程序计数器是线程私有的。

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

Java虚拟机栈

Java虚拟机栈占有的内存空间也就是我们平常所说的“栈内存”,并且也是线程私有的,生命周期与线程相同。

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时,都会创建一个栈帧,用于存储局部变量表(基本数据类型,对象的引用和returnAddress类型)、操作数栈、动态链接、方法出口等信息。

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

每个方法被调用直至执行完成的过程,就对应着一个栈帧,从虚拟机栈中从入栈到出栈的过程。对于Java虚拟机栈,有两种以尝情况:

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

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

本地方法栈

本地方法栈和虚拟机栈所发挥的作用非常相似,它们之间的区别主要是:虚拟机栈是为虚拟机执行的Java方法(即字节码)服务的,而本地方法栈则为虚拟机使用到的Native方法服务。

与虚拟机栈类似,本地方法栈也会抛出StackOverFlowError和OutOfMemoryError异常。

Java堆

Java堆是Java虚拟机所管理的内存中最大的一块。

Java堆在主内存中,是被所有线程共享的一块内存区域,其随着JVM的创建而创建,堆内存的唯一目的是存放对象实例和数组。同时Java堆也是GC管理的主要区域。

Java堆在物理上不需要连续的内存,只要逻辑上连续即可。如果堆中没有内存完成实例分配,并且也无法再扩展时,将会抛出OutOfMemoryError异常。

方法区

方法区是所有线程共享的一块内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区也有一个别名叫Non-heap(非堆),用来与Java堆区分。对于HotSpot虚拟机来说,方法区又习惯成为“永久代(Permancent Generation)”,但这只是对于HotSpot虚拟机来说的,其他虚拟机的实现上并没有这个概念。

相对而言,垃圾收集行为在这个区域比较少出现,但也并非不会来收集,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载上。

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

运行时常量池

运行时常量池属于方法区。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量表,用于存放编译期生成的各种字面常量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放(JDK1.7开始,常量池已经被移到了堆内存中了)。

也就是说,这部分内容,在编译时只是放入到了常量池信息中,到了加载时,才会放到运行时常量池中去。

运行时常量池县归于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容,才能进入方法区的运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用的比较多的是String类的intern()方法。

当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常,常量池属于方法区,同样可能抛出OutOfMemoryError异常。

为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料欢迎加入学习交流群:9285,05736

Java虚拟机知识汇总,有这些还怕面试被问到?相关推荐

  1. Java后端知识汇总(部分)

    Java后端知识汇总(部分) 一. Java基础 二. Redis知识详解 三. 计算机网络 四.Spring知识体系 五.Java虚拟机 六.Java高并发 (同一块知识建议结合着看,便于查漏补缺) ...

  2. “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?

    春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...

  3. 史上最强——JAVA基础知识汇总

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  4. Java 线程池 8 大拒绝策略,面试必问!

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:KL博客 kailing.pub/article/index/arcid/255.h ...

  5. 15w+字的计算机网络知识核心总结!再也不怕面试官问我网络知识了,飘了!

    大家好,我是小林. 我在 csdn 输出了 15w+ 的图解网络系列文章,每一篇文章都有我高清无ma的手绘图. 每一篇都相当干活,很多同学跟我说,我的图解网络打破了他们对计算机网络的恐惧,甚至还助力他 ...

  6. java并发知识汇总

    项目中用到并发的地方不多,一次是多个规则线程并发校验文档,一个是多个并发监控应用,比较简单,但查找并发资料后,发现有更好的方式.于是抽空想全面了解并发,可查到网上相关并发的技术文章很多,但是对我来说有 ...

  7. Java缓存知识汇总

    一.什么是缓存 [1]缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取.由于缓存的数据比内存快的多,所以缓存的作用就是 ...

  8. java 学习知识汇总

    一:常见模式与工具 学习Java技术体系,设计模式,流行的框架与组件是必不可少的: 常见的设计模式,编码必备 Spring5,做应用必不可少的最新框架 MyBatis,玩数据库必不可少的组件 二:工程 ...

  9. java基础知识汇总4

    三.集合(collection.set.list.map) 一.定义: 集合是Java里面最经常使用的,也是最重要的一部分.可以用好集合和理解好集合对于做Java程序的开发拥有无比的优点. 容器:用来 ...

最新文章

  1. 缺失的第一个正数—leetcode41
  2. C语言试题十六之写删除字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。
  3. 你们都被电视剧版的 《西游记》给骗了!| 今日趣图
  4. C++ 对引用的理解2
  5. 墨菲定律 -- 笔记
  6. python文件夹遍历_Python练习6-文件遍历
  7. python学习之文件处理
  8. LINUX:lpr不能打印,可以试试lp
  9. Servlet接收JSP参数乱码问题解决办法
  10. c语言对excel进行分类,六ABC分类法的Excel实现.doc
  11. 俄罗斯方块英文JAVA版下载_俄罗斯方块java源代码完美版
  12. SSH配置-使用Bitvise SSH Client工具在Windows下远程登陆Linux服务器
  13. CV之FR:基于某AI公司的API接口基于人脸识别实现计算人脸相似度(计算两张人脸图片相似度进而判断否为同一个人)—利用人工智能算法判断相似度极高的国内外明星案例应用
  14. 校园学生管理系统设想
  15. mysql查询连续记录
  16. Rayson API 框架分析系列之2:API服务开发
  17. 西北乱跑娃 --- bottle微框架从注册到应用(三)
  18. java cryptography_Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide...
  19. 《管理学》第五章 组织
  20. 迁移学习前沿探究探讨:低资源、领域泛化与安全迁移

热门文章

  1. 【计算机网络复习 数据链路层】3.4.4 选择重传协议(SR)
  2. 计算机网络(二十五)-IP数据报格式
  3. 二〇二二注定是踔厉奋发、笃行不怠的一年
  4. 计算机教室应用计划,计算机教室新学期工作计划
  5. java 毫秒转分钟和秒_PDF如何转换CAD文件?教你一分钟批量转上百文件方法,看完秒懂!...
  6. python编程入门单例_python实现单例模式怎么写啊?
  7. 操作系统--多进程管理CPU
  8. ARM 汇编基础教程番外篇 ——配置实验环境
  9. python之socket编程
  10. feedback.php,feedback.php