JVM虚拟机

JVM虚拟机

文章目录


image-20231027190003942

image-20231027190442601

image-20231027190456645

整体结构

image-20231027190736944

Java代码的执行流程

image-20231027191215706

架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构

基于栈的指令集架构

image-20231027191528790

基于寄存器的指令集架构

image-20231027191539894

image-20231027192002588

栈:跨平台性、指令集小、指令多、执行性能比寄存器差

生命周期

启动

image-20231027192520774

运行

image-20231027192532267

结束

image-20231027193047727

类加载子系统

内存结构概述

image-20231027193540522

类加载器

image-20231027194115572

image-20231027194329782

类加载过程

加载(loadiing)——连接(linking)——初始化(initialization)

加载

image-20231027194806770

连接

image-20231027195114747

初始化

image-20231027195909580

image-20231027200631881

在初始化之前,所有的类中的变量被赋值为0(除final修饰之外),初始化时才会对变量进行赋值

任何一个类声明以后,内部至少存在一个类构造器

分类

image-20231027201916319

image-20231027202034206

image-20231027202618162

引导类加载器(Bootstrap)

Java的核心类库都是由引导类加载器加载的

image-20231027202750785

扩展类加载器(Extension)

image-20231027203038205

系统类加载器(System)

image-20231027203141643

自定义类加载器

image-20231027203320950

方法

image-20231027203629862

image-20231027203709505

image-20231027203811815

ClassLoader

image-20231027203847449

类加载机制

双亲委派机制

image-20231027204811731

优势

image-20231027205257882

沙箱安全机制

image-20231027205334818

其他

类的主动使用与被动使用

image-20231027205652372

image-20231027205731870

image-20231027205834201

运行是数据区及线程

image-20231027212121310

image-20231027212534795

PC寄存器

image-20231027213209681

image-20231027213518575

举例

image-20231027214110812

经典面试题

image-20231027214218449

image-20231027214321442

虚拟机栈(由栈帧组成)

image-20231027215007469

image-20231027215248252

image-20231027220151420

优点

image-20231027220030694

栈常见异常

image-20231027220416328

image-20231030204014667

设置栈内存大小

image-20231030204058882

栈深入理解
栈存储什么

方法与栈帧一一对应。

image-20231030204839163

运行原理

image-20231030205115414

image-20231030205622623

方法结束方式:1.以return方式结束 2.以未捕获处理异常的方式结束

(重点)栈帧组成——局部变量表+方法返回地址+操作数栈+动态链接

image-20231030210021136

局部变量表结构(Local varivables)

image-20231030210436252

局部变量与成员对象

image-20231030210956641

所有方法在编译以后就确定了局部变量表的长度

image-20231030211203759

slot理解——局部变量表的最基本单位

image-20231030211838463

image-20231030212022081

局部变量的值根据开始索引访问

long和double类型的变量需要占用两个存储的slot,所以这两个类型变量的访存按照第一个索引为准。

image-20231030212804709

image-20231030213029530

slot的重复使用

image-20231030213133923

静态变量与局部变量对比

image-20231030213316210

类变量:linking的prepare阶段,类变量默认赋值,initial阶段给类变量赋值即静态代码块赋值

实例变量:随着对象的创建会在堆空间中分配实例变量空间,并进行默认赋值

局部变量:必须进行显式赋值,否则编译无法通过

image-20231030213927749

操作数栈

image-20231030214214083

image-20231030214806721

代码追踪操作数栈操作

image-20231030215251298

image-20231030222036610

栈顶缓存技术

image-20231031184739845

动态连接(指向运行时常量池的动态引用)

image-20231031184837373

image-20231031185056060

字节码文件中存在一个常量池,用于存储所有的变量和方法的符号化信息,动态链接用于对常量池中方法的符号信息进行引用。

image-20231031185444772

综合理解

image-20231031190321574

方法调用理解

将方法的符号引用转换为调用方法的直接引用与方法的绑定机制

绑定:一个字段、方法或者类再符号引用被替换为直接引用的过程。

静态绑定(编译期间确定)

image-20231031190739458

image-20231031191447402

动态绑定(运行期间确定)

image-20231031191503735

image-20231031191455693

虚方法与非虚方法

非虚方法:如果方法在编译期间就确定了具体的调用版本,这个版本在运行时是不可变的

静态方法、私有方法、final方法、实例构造器、父类方法

虚方法:只能在运行时确定调用的方法

image-20231031192258484

image-20231031192628878

image-20231031192736652

方法重写的本质

image-20231031193304440

虚方法表

用于存放动态链接过程中的方法的实际入口,减少动态链接的次数,提高性能

image-20231031193826572

方法返回地址

image-20231031194448763

用于存放抛出寄存器的值,在方法退出后返回到该方法被调用的位置,继续调用该方法的指令的下一条指令的地址

用于将出栈栈帧的内容传递给下一个栈帧,即将栈帧额呢绒传递给下一个调用者

image-20231031194738399

当方法正常返回时:

image-20231031194952612

异常退出:

image-20231031195101905

image-20231031195307726

垃圾回收不会影响到虚拟机栈空间

本地方法栈

image-20231031200726232

image-20231031200833027

image-20231031201141404

(重点)堆——线程共享

核心概述

image-20231031201758395

进程(jvm实例,即一个jvm虚拟机对应一个进程)唯一!!!!!!!!

image-20231031202114227

image-20231031203017968

image-20231031203148638

内存结构细分

image-20231031203646408

image-20231031203813880

堆空间大小设置

主要是设置年轻代和老年代的内存大小

image-20231031205932672

image-20231031210655314

开发中建议将初始堆内存与最大对内存设置为同样的值,为了防止扩容

image-20231031211330942

OOM报错

超出堆内存

image-20231031211407246

新生代与老年代中相关参数设置

image-20231031212142953

image-20231031212507247

image-20231031212643811

image-20231031212814278

对象分配一般过程

image-20231031213210103

image-20231031213220598

image-20231031213736534

对象分配特殊情况

image-20231031214746225

Minor GC Major GC Full GC对比

image-20231102190511576

Minor GC

image-20231102190909425

Major GC

image-20231102191209733

Full GC

image-20231102191406669

总结内存分配策略
  1. 如果对象在Eden出生并经过一次Minor GC之后仍然存活,并且能被Survivor容纳的话,被移动到Survivor空间中,并将对象年龄设置为1,对象在Survivor区中每经过一次Minor GC,年龄就会增加1,当它的年龄增加到一定程度(默认为15),就会被晋升到老年代。

  2. 对象晋升老年代的年龄阈值,可以通过 -XX:MaxTenuringThreshold来设置

    image-20231102192143782

TLAB

image-20231102192735571

image-20231102192901142

对象存储流程完善

image-20231102193016899

堆空间常用参数设置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(重点)方法区(元空间)——线程共享

image-20231102194243852

image-20231102194617139

image-20231102194840936

概述

方法区是独立于堆的一块存储空间

image-20231102195527625

设置方法区大小

image-20231102200006129

解决OOM

image-20231102200736437

内部结构

image-20231102201130356

类型信息

image-20231102201433945

域信息

image-20231102201811226

方法信息

image-20231102201829639

全局常量 (static+final修饰)

每个全局常量在声明时就被分配完毕

class文件中常量池的理解

image-20231102203807479

image-20231102211259241

运行时常量池

image-20231102211323222

静态变量和StringTable(存放在堆中)

image-20231102213432380

垃圾回收行为

image-20231102213546365

image-20231102214114666

image-20231102214320381

运行时数据区总结

image-20231102214411917

image-20231102214528801

对象实例化的方式

image-20231103190337910

对象创建的步骤

对象内存布局

image-20231103192455841

image-20231103192943089

对象访问定位

直接指针

image-20231103193503611

句柄访问

image-20231103193524386

直接内存

image-20231103194005057

IONIO
byte[] char[]Buffer
StreamChannel

image-20231103194456791

image-20231103194535430

直接内存大小设置

image-20231103195043373

执行引擎

image-20231103195255505

image-20231103195512329

概述

image-20231103195542010

image-20231103195908142

image-20231103195944174

程序的编译与解释

image-20231103203015764

image-20231103200445852

解释器

image-20231103201711836

image-20231103201835078

image-20231103202419598

JIT编译器

image-20231103203659962

image-20231103203900326

image-20231103204517286

解释器和JIT的选择

image-20231103205017392

image-20231103205223871

程序执行过程

image-20231103205520902

image-20231103205605230

HotSpot设置模式

image-20231103205823457

JIT编译策略

image-20231103210343932

image-20231103210414575

本地方法接口与本地方法库

image-20231031200011067

image-20231031200154856

image-20231031200550373

image-20231031200604829

垃圾回收

概述

image-20231103211519855

image-20231103211640428

image-20231103211933841

早期垃圾回收

image-20231103212110483

Java自动内存管理

image-20231103212214256

image-20231103212401818

image-20231103212651491

垃圾回收算法

标记阶段——引用计数算法

image-20231109191208427

例如:循环链表,当节点的指针域指向自身时,其他对象没有引用改链表节点,但不会被回收

标记阶段——可达性分析算法

image-20231109191649528

image-20231109191824223

image-20231109191900328

补充GCRoots

image-20231109192115427

image-20231109192430794

对象的finalization机制

垃圾回收之前的自定义处理机制

image-20231109192525157

image-20231109192818807

image-20231109193145975

对象标记

image-20231109193451198

清除阶段——清除算法

image-20231109194810934

image-20231109195233613

清除阶段——复制算法

image-20231109195656924
指针域指向自身时,其他对象没有引用改链表节点,但不会被回收

标记阶段——可达性分析算法

[外链图片转存中…(img-UlF0zBDZ-1729329852421)]

[外链图片转存中…(img-DiaeT0a9-1729329852422)]

[外链图片转存中…(img-eDUlewev-1729329852422)]

补充GCRoots

[外链图片转存中…(img-YlokvRcE-1729329852422)]

[外链图片转存中…(img-2pEFSZAT-1729329852422)]

对象的finalization机制

垃圾回收之前的自定义处理机制

[外链图片转存中…(img-5AQsbXqA-1729329852423)]

[外链图片转存中…(img-GSqFY5vJ-1729329852423)]

[外链图片转存中…(img-gzMcnP1Z-1729329852423)]

对象标记

[外链图片转存中…(img-FunDcRTZ-1729329852423)]

清除阶段——清除算法

[外链图片转存中…(img-lW4sT6FQ-1729329852423)]

[外链图片转存中…(img-zeDhPvYn-1729329852424)]

清除阶段——复制算法

[外链图片转存中…(img-CHiA3Ykm-1729329852424)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值