JVM 总结

面试 java 虚拟机

jvm 基础

jvm

  • Write Once Run EveryWhere
    jar 包可以在任何兼容jvm上运行
    jvm 适配器 屏蔽掉底层差异
    内存管理

jdk

  • 由.java - .class
  • jvm 监控工具

jre

  • 由.class - 机器码

jvm 运行时数据区

avatar

代码进入jvm后进行分解运行

  • 数据(线程共享区)
    方法区,java堆
  • 指令(线程独占区)
    虚拟机栈
    本地方法栈
    程序计数器

is what ?

程序计数器

指向当前代码正在运行的字节码指令的地址 行号
jvm 最小执行单位 线程
用于 保存线程

虚拟机栈

  • 存储当前线程运行方法所需要的 数据 指令 和 返回地址
栈帧

局部变量表
操作数栈
动态链接

常量池
动态解析
XSS 虚拟机栈的最大深度 // 循环调用会爆

出口
...
将一个局部变量加载到操纵栈的指令包括:iload、iload_、lload…

将一个数值从操作数栈存储到局部变量表的指令包括:istore、istore_、lstore…

下面是我的java代码

public static int add(int a,int b){
    int c=0;
    c=a+b;
    return c;
}

下面是编译后的字节码,也加上了我的理解,如果解释不恰当,谢谢指出

0: iconst_0 //常量0压入操作数栈
1: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
2: iload_0 //第0个变量压入操作数栈
3: iload_1 //第1个变量压入操作数栈
4: iadd //操作数栈中的前两个int相加,并将结果压入操作数栈顶
5: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
6: iload_2 //加载局部变量表的第2个变量到操作数栈顶
7: ireturn //返回

方法区

>*  类信息 常量 静态变量  JIT

why ?

jvm 内存模型

Alt text

原文地址:https://www.cnblogs.com/joeylee97/p/8557056.html