JVM 内存结构

下面有一张 Java 代码的执行过程图:

代码的执行过程

java 复制代码
public class Demo {

    public static void main(String[] args) {
        Student student = new Student();
        student.study();
        student.hashCode();
        student = null;
    }
}

class Student {
    public void study() {

    }
}

根据上面这段代码,具体了解代码的执行过程。

  1. 执行 javac 命令,将源代码编译为字节码
  2. 触发类加载机制:创建 JVM,将类信息存入方法区,包括类的继承信息等
  3. 创建 main 线程,虚拟机栈为 main 方法分配内存(其余线程的内存均为虚拟机栈分配的),然后执行 main 方法
  4. 在向下执行的过程中,遇到了 Student 这个类。由于这个类还没有加入方法区中,也会触发类加载机制
  5. 对于 new 出来的对象,会将该对象存入堆内存中
  6. 对于不需要使用的对象,会在内存不足的时候由垃圾回收器进行回收
  7. 方法内的局部变量、方法参数使用的是虚拟机栈中的内存
  8. 调用方法时,会现在方法去中获取方法的字节码指令,由解释器将字节码指令解释为机器码执行
  9. 当线程发生切换时,需要记录该线程运行到哪一步了,这就需要程序计数器,这样当线程拿到 CPU 资源时就可以继续向下运行
  10. 对于非 Java 实现的方法调用,使用的内存为本地方法栈
  11. 当某段代码被频繁调用时,JIT 即时编译器会将这些带啊编译成机器码缓存,提高代码的执行效率

内存溢出

出现 OutOfMemoryError

  • 堆内存耗尽:对象越来越多,由于一直在使用,不能被回收
  • 方法区内存耗尽:加载的类越来越多,很多框架都会在运行期间动态产生新的类
  • 虚拟机栈积累:每个线程最多会占用 1M 的内存,当线程数越来越多但是却一直在运行而不能被销毁

出现 StackOverflowError

  • 这个异常大家应该都很熟悉,即 JVM 虚拟机栈中,方法一直递归调用无法退出的情况
相关推荐
寂寞的船3 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
金銀銅鐵4 天前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
yeccheng6 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
On The Road :8 天前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Yves..8 天前
JVM 学习笔记:内存区域、类加载机制与垃圾回收
jvm
akinggw9 天前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
yh弓长9 天前
JVM 核心机制
jvm
tg_xianheyun10 天前
腾讯云国际账号注册代充值适合哪些海外业务场景?
jvm
yuniko-n10 天前
【JVM】对象内存布局
java·开发语言·jvm
wuminyu10 天前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++