阿里P7带你深入浅出JVM的运行机制

2020-12-17  本文已影响0人  JAVA架构师的圈子

<font color=#00ffff size=72>概述

1. 基本概念:

JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。

2. 运行过程:

我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。 也就是如下:

Java 源文件—->编译器—->字节码文件
  
字节码文件—->JVM—->机器码

每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

在这里插入图片描述
3. 线程:

Hotspot JVM 后台运行的系统线程主要有下面几个:


在这里插入图片描述

一、JVM启动流程

在这里插入图片描述

二、JVM内存区域

JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。

程序计数器(线程私有)

虚拟机栈(线程私有)

是描述 java 方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。由此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部,以及使用递归方法的时候容易导致栈内存溢出的现象。

栈帧中数据的说明:

在这里插入图片描述
局部变量表:

指向在方法执行的过程中使用的常量。
方法返回地址:

当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。

本地方法栈(线程私有)
  本地方法区和 Java Stack 作用类似, 区别是虚拟机栈为执行 Java 方法服务, 而本地方法栈则为Native 方法服务, 如果一个 VM 实现使用 C-linkage 模型来支持 Native 调用, 那么该栈将会是一个C 栈,但 HotSpot VM 直接就把本地方法栈和虚拟机栈合二为一。

java堆(线程共享)

三、JVM运行时内存

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor区和To Survivor区)和老年代。

在这里插入图片描述
1. 新生代:

Eden区:Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当 Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行一次垃圾回收。
Servivor From:上一次 GC 的幸存者,作为这一次 GC 的被扫描者。

Servivor To:保留了一次 MinorGC 过程中的幸存者。
MinorGC 的过程(复制->清空->互换):MinorGC 采用复制算法。

1:eden、servicorFrom 复制到 ServicorTo,年龄+1

首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不够位置了就放到老年区);
  
2:清空eden、servicorFrom

然后,清空 Eden 和 ServicorFrom 中的对象;
  
3:ServicorTo和ServicorFrom互换

最后,ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom区。
  
2. 老年代:

四、内存模型

在这里插入图片描述

下图为多个线程执行的过程:

在这里插入图片描述
https://www.cnblogs.com/wslook/p/9126569.html image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,
需要获取这些内容的朋友请加Q君样:
756584822

上一篇下一篇

猜你喜欢

热点阅读