美文网首页JVM
JVM 总结01

JVM 总结01

作者: 小超_8b2f | 来源:发表于2020-04-08 19:22 被阅读0次
    1. 源码
    public class Math {
        public static final int CONSTANT = 666;
        
        public int math() {
            int a = 1;
            int b = 2;
            int c = (a + b) * 10;
            return c;
        }
        
        public static void main(String[] args) {
            Math math = new Math();
            math.math();
        }
    }
    
    1. javap -c 类名: 反编译
    guchunchaodeMacBook-Air:javacode guchunchao$ javap -c Math
    Compiled from "Math.java"
    public class Math {
      public static final int CONSTANT;
    
      public Math();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public int math();
        Code:
           0: iconst_1
           1: istore_1
           2: iconst_2
           3: istore_2
           4: iload_1
           5: iload_2
           6: iadd
           7: bipush        10
           9: imul
          10: istore_3
          11: iload_3
          12: ireturn
    
      public static void main(java.lang.String[]);
        Code:
           0: new           #2                  // class Math
           3: dup
           4: invokespecial #3                  // Method "<init>":()V
           7: astore_1
           8: aload_1
           9: invokevirtual #4                  // Method math:()I
          12: pop
          13: return
    }
    

    JVM指令集CSDN整理

    第一步:数据1放入操作数栈中 步骤二:在局部变量表中为变量a开辟一块内存区域,并将第一步中操作数栈中的1出栈赋值给变量a 第三步:在操作数栈中开辟一块儿内存空间存放数字2,再将局部变量表中开辟一块儿内存空间存放变量b 第四步:将操作数栈中的数字:2出栈并赋值到局部变量表中的b变量中

    第五步:将局部变量表中的【a的值】,【b的值】装载到操作数栈中
    第六步:从操作数栈中弹出2,再弹出1,由CPU运算完成后的结果:3,再次压入到操作数栈

    第七步:在局部变量表中开辟一块儿新空间存放变量C,将操作数栈中的数值3出栈并赋值给局部变量表中的变量C

    每个方法都有自己的栈帧,栈帧里都有

    1. 局部变量表:
    2. 操作数栈:程序在操作过程中一些临时的中间操作会借助此区域做中转,存放数据
    3. 动态链接
    4. 方法出口
    5. 程序计数器:记录的是线程马上要执行的下一行代码的内存指针
    6. 方法区Metaspace:JDK1.8之前还算是JVM内存模型中的一块,但是1.8开始是直接用的物理内存。因为:程序在启动过程中类装载子系统要把很多代码装载到【类方法区】,很多字节码大小是没法预估的,包括如果程序有大量的反射代码,反射生成的类元信息都是放在方法区,很容易导致方法区内存溢出,所以JVM做了一个优化,让其分配在直接(物理)内存里。
    7. 堆里的对象中会有一个指针指向方法区的类的类元信息,所以同类的不同的对象可以执行相同的程序逻辑。
    栈中变量的引用指向堆内存空间中的对象,堆中的对象头中有类元信息的指向,本地方法栈是存放native描述的C语言代码执行时产生的内存消耗

    minor-GC 新生代的Eden区的GC
    full-GC 老年代的GC

    a class file life cuycle 马士兵 - JVM组成 - 背过 Programer Counter - 线程独有 JVM Stacks 线程独有 Native Method Stacks - 线程独有 堆 - 线程共享 方法区 - 线程共享 运行时常量池 - 线程共享区域 image.png image.png image.png image.png 栈帧

    局部变量表
    操作数栈
    动态链接
    返回值地址
    一个方法一个栈帧:one method one frame

    栈帧的构成

    IDE jclasslib 插件安装
    view --> show bytecode with jclasslib

    总有一个开始,不妨从今天开始
    知耻而后勇
    你现在感到压力是因为你欠了很多债,现在开始还不晚,麻烦你花点时间把这些债都补上。

    相关文章

      网友评论

        本文标题:JVM 总结01

        本文链接:https://www.haomeiwen.com/subject/mrfcuctx.html