从虚拟机角度看,一段 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/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 从虚拟机角度看,一段 Java 代码如何执行的

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址