jvm

150 阅读2分钟

引言

image.png

一、内存结构

程序计数器

image.png

定义

image.png

作用

虚拟机栈

image.png

定义

image.png

栈内存溢出

  • 栈帧过多导致栈内存溢出
  • 栈帧过大导致栈内存溢出

线程运行诊断

image.png

本地方法栈

image.png

定义

Heap 堆

  • 通过 new 关键字,创建对象都会使用堆内存

特点

  • 它是线程共享的,堆中对象都需要考虑线程安全的问题
  • 有垃圾回收机制

堆内存溢出

堆内存诊断

image.png

方法区

直接内存

定义

Direct Memory

  • 常见于 NIO 操作时,用于数据缓冲区
  • 分配回收成本较高,但读写性能高
  • 不受 JVM 内存回收管理

分配和回收原理

  • 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
  • ByteBuffffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffffer 对象,一旦
  • ByteBuffffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调
  • 用 freeMemory 来释放直接内存

二、垃圾回收

如何判断对象可以回收

引用计数法

可达性分析算法

四种引用

垃圾回收算法

标记清除

标记整理

复制

分代垃圾回收

垃圾回收器

垃圾回收调优

三、类加载器

image.png

image.png

类文件结构

image.png

image.png

魔数

image.png

版本

image.png

常量池

image.png

image.png

image.png

。。。

详细的参考下面的视频的

www.bilibili.com/video/BV1yE…

访问标识与继承信息

image.png

image.png

Field信息

image.png

Method信息

image.png

image.png

附加信息

image.png

字节码指令

入门

image.png

image.png

javap工具

image.png

图解方法执行流程

原始java代码

image.png

编译后字节码文件

常量池载入运行时常量池

image.png

方法字节码载入方法区

image.png

main线程运行,分配栈帧

image.png

  • 局部变量表
  • 操作数栈

执行引擎开始执行字节码

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

。。。

image.png

image.png 。。。

image.png 。。。

练习分析

image.png

image.png

略。。。

条件判断指令

image.png

image.png

image.png

循环控制指令

image.png

练习判断结果

image.png

结果:0 分析:x = x++ 过程:

  • 将局部变量x的值0加载到操作数栈
  • 局部变量x的值++,变成1
  • 将操作数栈的0再赋值给局部变量x,故又变成0;

构造方法

()V

整个类的构造方法

image.png 最终结果为:30,覆盖了,以最后的为准

()V

对象的构造方法

image.png

image.png

方法调用

学习参考视频

www.bilibili.com/video/BV1yE…