JVM内存模型

加载机制: 加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化 -> 使用 -> 卸载

Java文件通过 javac 编译为字节码文件,在通过 java 命令运行(Java虚拟机开始工作)。
首先通过 类装载子系统 把字节码文件加载到 运行时数据区,并分配内存,最终用 字节码执行引擎 来运行运行时数据区的代码。

JVM内存调优

上面图中名称解释:

  • 类加载器(ClassLoader)在JVM启动时或者在类运行时将需要的class加载到JVM中。
  • 字节码执行引擎负责执行class文件中包含的字节码指令。
  • 内存区(也叫运行时数据区)是在JVM运行的时候操作所分配的内存区。
    • java堆(Heap): 存放new创建的对象和数组。这块是GC的主要区域。
    • java栈(Stack): 存放局部变量(基本类型变量和对象的引用变量)。
      栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈。
      在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。
      每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是现成私有的。
    • 程序计数器(PC Register): 用于保存当前线程执行的内存地址。
      由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。
    • 本地方法栈(Native Method Stack)和java栈的作用差不多,只不过是为JVM使用到的Native方法服务( java 调用非 java 代码的接口,该方法并非 Java 实现的,可能由 C 或 Python等其他语言实现的)。

相关文章: