转载

从虚拟机角度看,一段 Java 代码如何执行的

  • 一段 Java 代码如何执行的
  • 字节码、机器码、线程、栈、执行、字节码指令、元数据
// Dog.java
class Dog {
    String name;
    public Dog (String name) {
        this.name = name
    }
    
    void speak(String str){
        System.out.println(this.name+str);
    }
}
public class Test {
   public static void main(String[] args){
        Dog dog = new Dog("jiaBa");
        dog.speak("汪汪"); // 
    }    
}

使用 javac Test.java 编译为 Test.class,

  • class 文件按一定规则存放类的相关信息,包含常量池、方法表(Coder)等
  • 方法变为字节码指令,由方法表存放

java Test 执行 Test.class

  • 通过全限定名加载字节码文件
  • 将静态存储结构转换为运行时结构
  • 在内存中新建一个代表这个类的 java.lang.Class 对象,作为方法区这个类各种数据的访问入口
  • 创建对象时,会借助类对象吗?调用方法时,会借助类对象吗?
  • 类加载器通过全限定名将 class 文件加载到虚拟机的方法区中,虚拟机为其关联一个 Class 对象实例。为类变量分配内存,设置默认值为 null
  • 线程执行执行 main 方法(根据字节码文件)。在 Java 虚拟机栈中新建一个栈帧,栈帧包含局部变量表和操作数栈,在局部变量表中分配一个 slot 给 args,args 为空,使用一个 slot 存放 jinBaDog,
  • 执行 Dog() 构造方法,在堆中分配一块内存,新建一个对象。
Thread Stack    Heap Memory
                
  Dog()
  main

从虚拟机角度看,一段 Java 代码如何执行的

对象实例存放在堆中,内存中,结构是什么。

class Employee {
    String name;
    Integer salary;
    Integer sales;
    Integer bonus;

    public Employee(String name, Integer salary, Integer sales) {
        this.name = name;
        this.salary = salary;
        this.sales = sales;
    }
}

public class Test {
    static int BONUS_PERCENTAGE = 10;

    static int getBonusPercentage(int salary) {
        int percentage = salary * BONUS_PERCENTAGE / 100;
        return percentage;
    }

    static int findEmployeeBonus(int salary, int noOfSales) {
        int bonusPercentage = getBonusPercentage(salary);
        int bonus = bonusPercentage * noOfSales;
        return bonus;
    }

    public static void main(String[] args) {
        Employee john = new Employee("John", 5000, 5);
        john.bonus = findEmployeeBonus(john.salary, john.sales);
        System.out.println(john.bonus);
    }
}
  • 编译成 class 文件
  • 加载 class 文件进入元数据区,并创建一个 类对象,类对象包含类所有信息。
  • new 对象时,加载对应 class 文件到元数据区。执行 class 的构造方法。

从虚拟机角度看,一段 Java 代码如何执行的

延伸阅读

  • Visualizing memory management in JVM(Java, Kotlin, Scala, Groovy, Clojure)
  • What do Java objects look like in memory during run-time?
  • Java Objects Memory Structure
  • What is the memory consumption of an object in Java?
  • 廖雪峰 - Java 教程
  • 我是一个 Java Class

重定向

  • 访问文件,不存在,跳转到 404,404 根据当前网址寻找重定向网址,重新跳转
var newUrl = map.get(window.loction);
if (newUrl !== null){
    window.loction = newUrl
}
原文  https://depp.wang/2020/03/31/java-code-process-in-jvm/
正文到此结束
Loading...