风之旅人 Android Dev Engineer

JVM内存模型(栈帧)

2019-12-23
Java  JVM
 

JVM内存模型

todo 2019年12月23日 20:23:30 https://www.bilibili.com/video/av64709063?p=3

  1. 视频 https://www.bilibili.com/video/av64709063
  2. JVM指令手册 https://blog.csdn.net/hudashi/article/details/7062675
  3. 有助理解的帖子 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参数

相关文章

下一篇 Kotlin学习笔记

评论