JVM从原理到调优

JVM的定位


image-20260113210806328

JDK 包含 JRE 包含JVM

将类文件运行的流程

javac编译流程

类加载机制

整体流程:

装载 -> 链接 ->初始化

装载

从指定的路径或源(如文件系统、网络等)中查找并加载类的字节码到 Java 虚拟机中

  1. 找到文件所在未知:全路径 -> 类加载器 -> 寻找类

image-20260113210444718

  • 类加载器加载时,先尝试让parent去加载,parent加载不到才会去加载

    打破双亲委派的方法:重写loadClass方法,打破原有先尝试让parent加载的规则

  1. 类文件的信息交给JVM

    • 类的静态信息(如类结构和静态变量) -> 方法区
    • 类的对象实例-> 堆内存

链接

  1. 验证

    • 保证被加载的类的正确
  2. 准备

    • 要为类的静态变量分配内存空间,并将其值初始化默认值
  3. 解析

    • 将类中的符号引用转为位直接引用
      • 符号引用: class 文件中使用符号做的"代称"

初始化

为静态变量赋真正的值

运行时数据区

image-20260113213553123

方法区 Method Area

方法区只有一个,线程共享(线程非安全),生命周期和虚拟机一致,存储类信息,常量,静态变量,即时编译器编译后的代码

垃圾回收机制一般不讨论方法区的回收

方法区也会报OOM

堆 Heap

堆只有一个,线程共享(线程非安全),生命周期和虚拟机一致,存储对象和数组

会报OOM

Java虚拟机栈

一个线程创建代表一个栈

方法数量溢出栈会报StackOverFlow

栈帧

  1. Local Variables
  2. Operand Stacks
  3. Dynamic Linking
  4. Invocation Completion
posted @ 2026-01-13 21:40  庚申码上仙  阅读(0)  评论(0)    收藏  举报