本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘


JDK,JRE,JVM的联系是啥?

JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚

JVM的作用是啥?

JVM有2个特别有意思的特性,语言无关性和平台无关性。

语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。

平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere

JVM运行时数据区

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域

其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图

程序计数器

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

为什么要记录当前线程所执行的字节码的行号?直接执行完不就可以了吗?

因为代码是在线程中运行的,线程有可能被挂起。即CPU一会执行线程A,线程A还没有执行完被挂起了,接着执行线程B,最后又来执行线程A了,CPU得知道执行线程A的哪一部分指令,线程计数器会告诉CPU。

虚拟机栈

虚拟机栈存储当前线程运行方法所需要的数据,指令,返回地址。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈道出栈的过程。

局部变量表存储存储局部变量,是一个定长为32位的局部变量空间。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用一个。引用类型(new出来的对象)如何存储?看下图

public int methodOne(int a, int b) {Object obj = new Object();return a + b;
}

如果局部变量是Java的8种基本基本数据类型,则存在局部变量表中,如果是引用类型。如String,局部变量表中存的是引用,而实例在堆中。

假如methodOne方法调用methodTwo方法时, 虚拟机栈的情况如下

当虚拟机栈无法再放下栈帧的时候,就会出现StackOverflowError,演示一下

public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {JavaVMStackSOF oom = new JavaVMStackSOF();try {oom.stackLeak();} catch (Throwable e) {System.out.println("stack length: " + oom.stackLength);throw e;}}
}

在idea中设置运行时的线程的堆栈大小为如下

-Xss 参数的作用是设置每个线程的堆栈大小 运行输出为

-Xss参数的值越大,打印输出的深度越大

接着解释一下操作数栈,还是比较容易理解的 假如Test.java中有如下方法,

public int getSum(int a, int b) {return a + b;
}

反编译生成的Test.class文件,并输出到show.txt中

javap -v Test.class > show.txt

show.txt的内容如下

public int getSum(int, int);descriptor: (II)Iflags: ACC_PUBLICCode:stack=2, locals=3, args_size=30: iload_11: iload_22: iadd3: ireturnLineNumberTable:line 12: 0

解释一下上面的语句

iload_1:局部变量1压栈
iload_2:局部变量2压栈
iadd:栈顶2个元素相加,计算结果压栈

简单2个数相加都会用到栈,这个栈就是操作数栈,更不用说复杂的语法了

本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈锁发挥的作用是非常相似的,他们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

Java堆

对于大多数应用来说,Java堆(Java Heap)是Java虚拟机锁管理的内存中最大的一块。Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存

方法区

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

JVM内存模型

由颜色可以看出,jdk1.8之前,堆内存被分为新生代,老年代,永久带,jdk1.8及以后堆内存被分成了新生代和老年代。新生代的区域又分为eden区,s0区,s1区,默认比例是8:1:1,元空间可以理解为直接的物理内存


本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘

面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘相关推荐

  1. Android进阶必备:滑动冲突解决与事件分发机制(附视频讲解)这篇看完还不懂请寄刀片

    1.前言 Android学习一段时间,需求做多了必然会遇到滑动冲突问题,比如在一个ScrollView中要嵌套一个地图View,这时候触摸移动地图或者放大缩小地图就会变得不太准确甚至没有反应,这就是遇 ...

  2. hashmap put过程_看完还不懂HashMap算我输(附互联网大厂面试常见问题)

    HashMap的原理与实现 版本之更迭: –>JDK 1.7 : Table数组+ Entry链表: –>JDK1.8 : Table数组+ Entry链表/红黑树:(为什么要使用红黑树? ...

  3. 看完还不懂HashMap算我输(附职场面试常见问题)

    HashMap的原理与实现 版本之更迭: –>JDK 1.7 : Table数组+ Entry链表: –>JDK1.8 : Table数组+ Entry链表/红黑树:(为什么要使用红黑树? ...

  4. 计算机主机电源怎么换,电脑主机不会拆装更换电源怎么办?详细图文来教你,看完你就会了...

    原标题:电脑主机不会拆装更换电源怎么办?详细图文来教你,看完你就会了 我们的电脑用了久了,总会出现这样或那样的问题,当电脑的电源如果因电压不稳或功率不够和损坏需要更换的时候,该怎样拆装更换台式电脑主机 ...

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

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

  6. 最新Java面试八股文,1000+面试题答案详解全面看完拿下大厂offer

    进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里.美团.滴滴.头条等大厂面试大全,其中概括的知识点有:Java.MyBatis.ZooKeeper.Dubbo.Elast ...

  7. 面试官:说一下线程池内部工作原理?

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:清泉 cnblogs.com/qingquanzi/p/8146638.html 随着cpu核数越来越多,不可避免的利用多 ...

  8. 轻松了解面试官心理!ElasticSearch写入数据的工作原理是什么? | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 作者:手留余香 转自: Java架构沉思录 面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene ...

  9. python面试技巧_经典7大Python面试题!看完考官竟然给了我30k的薪资

    Python面试(一)之交换变量值 平时时不时会面面实习生,大多数的同学在学校里都已经掌握了Python.面试的时候要求同学们实现一个简单的函数,交换两个变量的值,大多数的同学给出的都是如下的答案 实 ...

最新文章

  1. 在VS中,如何新建项目,如何添加类库
  2. mysql nextval同步锁_mysql中实现类似oracle中的nextval函数
  3. Java多线程编程那些事:volatile解惑--转
  4. java awt table_java.awt.image 类 LookupTable - Java 中文参考手册
  5. npm的插件如何直接在html中使用,webpack插件之htmlWebpackPlugin
  6. html5 canvas图文编辑器源码_5个微信编辑器,再也不用为公众号发愁啦
  7. URL编解码、Big Endian和Little Endian
  8. Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器
  9. Spring使用经验之Listener综述
  10. JavaScript中使鼠标光标变为图片
  11. JavaScript在线解压 ZIP 文件 JavaScript 怎样在线解压 ZIP,jszip实现解压压缩包,并下载压缩包内文件
  12. ASML的EUV光刻机卖不动?
  13. 神秘的杀毒软件原理曝光
  14. cygwin里安装apt-cyg网络工具及使用
  15. 【自用错题集】C语言 基础错题整理
  16. 收藏一个Ping的小工具类,可用于网络中检测目的设备是否在线
  17. js模板引擎Template.js使用详解及免费下载template.js
  18. 改变命运的早上三分钟 之 三
  19. python的pytest模块:pytest命令行详解
  20. 【shaderforge学习笔记】 Vector Operations(向量运算)

热门文章

  1. 【每日新闻】2019年宏观经济展望!
  2. Php大马的简单解密[技巧]
  3. 深度学习基于DEAP的脑电情绪识别情感分类(附代码)
  4. 表情识别/情绪识别:ExpW表情数据集
  5. 苹果怎么找计算机历史记录,如何在苹果电脑上恢复已删除的上网历史记录
  6. Mapper代理文件实现
  7. 1^3+2^3+3^3+...+n^3通项公式
  8. 计算哪一年哪个月份有多少天
  9. 2021-06-03web渗透学习之mof提权(MySQL 漏洞利用与提权)(转自国大佬)
  10. 为南通市2017中考数学试卷画的图