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 虚拟机栈中,方法一直递归调用无法退出的情况
相关推荐
磁爆步兵8 小时前
内存分区:程序运行的核心秘密
java·开发语言·jvm
讓丄帝愛伱10 小时前
JVM线上故障快速排
jvm
落苜蓿蓝10 小时前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
一只专注api接口开发的技术猿11 小时前
OpenClaw 实战:搭建京东商品监控与简易数据分析脚本
大数据·jvm·数据库·oracle·数据分析
Tim_101 天前
【C++】021、RAII
jvm
格兰芬多呼神护卫1 天前
# Agent 企业评估方案深度分析:从“看答案”到持续质量闭环_码士教育
java·开发语言·jvm
CodeStats1 天前
【Java GC】Java JVM 垃圾回收(GC)完全指南:从内存结构到并发回收的底层原理
java·jvm·gc·垃圾回收·zgc·内存结构
ChaHae-In1 天前
JVM运行时数据区与垃圾回收
jvm
IKUN家族2 天前
Spring JVM(二)
java·jvm·spring
程序员天天困2 天前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端