JVM内存模型
todo 2019年12月23日 20:23:30 https://www.bilibili.com/video/av64709063?p=3
- 视频 https://www.bilibili.com/video/av64709063
- JVM指令手册https://blog.csdn.net/hudashi/article/details/7062675
- 有助理解的帖子 https://segmentfault.com/q/1010000008683475
JVM结构图

Java线程内存模型JMM

- JVM 从软件层面屏蔽不同操作系统在底层硬件与指令上的区别 ;
- 栈帧 : 一个方法对应一块栈帧内存区域 ; 先进后出 FILO , 方法执行完后依次出栈
- 程序计数器: 线程特有的,标识线程马上要执行的那一行代码的内存地址指针
- store 和 load : 操作数栈 👉 局部变量表 , store 局部变量表 👉 操作数栈 , load
- 操作数栈:数据临时存储区域
- 方法出口:调用该方法时的位置 “从哪进来的从哪出去”
- 引用类型(new 出来的对象) : 用堆替代操作数栈存储数据 , 即 局部变量表 👉 堆
public class JVM01_Math {
    public static final Integer CONSTANT = 666;
    public int compute() {
        int a = 1;
        int b = 2;
        int c = (a + b) * 10;
        return c;
    }
    public static void main(String[] args) {
        JVM01_Math jvm01Math = new JVM01_Math();
        jvm01Math.compute();
    }
}
☘ 反汇编 javap -c JVM01_Math.class :
PS C:\fastwork\Project\Idea\AndoJava\target\classes\jvm> javap -c JVM01_Math.class
Compiled from "JVM01_Math.java"
public class jvm.JVM01_Math {
  public static final java.lang.Integer CONSTANT;
  public jvm.JVM01_Math();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public int compute();
    Code:
       0: iconst_1              //将int型(1)推送至栈顶
       1: istore_1              //将栈顶int型数值存入第二个本地变量
       2: iconst_2              //
       3: istore_2          
       4: iload_1               //将第二个int型本地变量推送至栈顶
       5: iload_2               //将第三个int型本地变量推送至栈顶
       6: iadd                  //将栈顶两int型数值相加并将结果压入栈顶,执行1+2
       7: bipush        10      //将单字节的常量值(-128~127)推送至栈顶
       9: imul                  //将栈顶两int型数值相乘并将结果压入栈顶,执行3x10
      10: istore_3              //将栈顶int型数值存入第四个本地变量, int c =3
      11: iload_3               //
      12: ireturn
  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class jvm/JVM01_Math
       3: dup
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: invokevirtual #4                  // Method compute:()I
      12: pop
      13: return
  static {};
    Code:
       0: sipush        666
       3: invokestatic  #5                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       6: putstatic     #6                  // Field CONSTANT:Ljava/lang/Integer;
       9: return
}
✨ 参考: JVM指令手册.pdf
🍎 分析
int a = 1;
istore_1  
...
iload_1   
iload_2   将第三个int型本地变量推送至栈顶
GC
GC调优步骤:
1、打印GC日志
-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps  -XX:+PrintGCDateStamps  -Xloggc:./gc.log
Tomcat则直接加在JAVA_OPTS变量里
2、分析日志得到关键性指标
3、分析GC原因,调优JVM参数