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 虚拟机栈中,方法一直递归调用无法退出的情况
相关推荐
逻极5 小时前
Java 从入门到精通:核心原理、最佳实践与性能优化
java·jvm·并发编程·集合框架
light blue bird7 小时前
Razor Pages工序管理Web端界面化实现方案
jvm·windows·web端
小江的记录本18 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
小江的记录本20 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
小江的记录本20 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试
ID_180079054731 天前
小红书评论 API 接口详解与实战开发
java·jvm·c++
東雪木1 天前
JVM 与 Java 内存模型 专属复习笔记
java·jvm·笔记·java面试
Undergoer_TW1 天前
Colmap 进军嵌入式:SQLite 数据库从崩溃退出到自动治愈
jvm·数据库·sqlite
骄马之死1 天前
ThreadLocal 核心原理
java·jvm·算法
一只小白0001 天前
【JVM | 第二篇】—— 类加载器 & 双亲委派模型
jvm