首页 > 编程语言 >Java 程序编译和运行过程

Java 程序编译和运行过程

时间:2024-01-25 23:11:10浏览次数:50  
标签:Java Person 程序 编译 JVM 方法 class 加载

Java程序从 .java 文件创建到程序运行要经过两大过程:

  • .java 文件由编译器编译成 .class文件
  • 字节码由 JVM 解释运行

编译过程

.java 源文件会被 Java编译器进行编译为.class文件:

  • Java 编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果 Java 编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,则会报
    "Cant found sysbol" 的异常错误。
  • 编译后的 .class 文件主要分为两部分:常量池和方法表集合。
    常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引用(类引用、方法引用,成员变量引用等);
    方法表集合则记录各个方法的字节码。

运行过程

JVM 并不是在运行时就会把所有使用到的类都加载到内存中,而是用到的时候,才加载进方法区,并且只加载一次。
Java类运行的过程大概分为两个步骤:

  • 类加载
  • 执行类

举例说明 Java 程序运行过程:

public class Person {
    private String name;

    public Person(String name){
        this.name=name;
    }

    public void sayHello(){
        System.out.println("Hello! My Name is: " + name);
    }
}
public class JVMTest {
    public static void main(String[] args) {
        Person p=new Person("Li Ming");
        p.sayHello();
    }
}

1. 类加载

首先编译 JVMTest.java 文件得到 JVMTest.class 文件,系统启动一个 JVM 进程,从 classpath 路径中找到 JVMTest.class 文件,将 JVMTest 的类信息加载到方法区中,这个过程称为 JVMTest 类的加载。

(只有类信息在方法区中,才能创建对象,使用类中的成员变量)

2. JVM 找 main() 方法入口

在 main() 方法 入口持有一个指向当前类 (JVMTest) 常量池的指针,常量池中的第一项是一个对 Person 对象的符号引用。

main 方法中 `Person p=new Person("Li Ming"),JVM 需要创建一个 Person 对象,但是此时方法区中是没有 Person 类信息的,所以 JVM 需要加载 Person 类,将 Person 类的信息加载到方法区中。

JVM 以一个直接指向方法区 Person 类的指针替换了常量池中第一项的符号引用。

3. 实例化对象

加载完 Person 类的信息以后,JVM 就会在堆中为一个 Person 实例分配内存,然后调用构造方法初始化 Person 实例,并且该实例持有指向方法区中的 Person 类的类型信息(其中包括方法表)的引用

(p 为指向该 Person 实例的引用,会被放到栈中)

4. 运行方法

执行 p.sayHello(),JVM 根据栈中 p 的引用找到 Person 对象,然后根据 Person 对象持有的引用定位到方法区中 Person 类类信息的方法表,获得 sayHello 方法的字节码地址,然后开始运行方法。

参考:

标签:Java,Person,程序,编译,JVM,方法,class,加载
From: https://www.cnblogs.com/i9code/p/17988393

相关文章

  • java中内置锁
    1.概述Java内置锁是一个互斥锁,最多只有一个线程能够获得该锁,当线程B尝试去获得线程A持有的内置锁时,线程B必须等待或者阻塞,直到线程A释放这个锁,如果线程A不释放这个锁,那么线程B将永远等待下去。Java中每个对象都可以用作锁,这些锁被称为内置锁。线程进入同步代码块或方法时会自......
  • 2024年1月Java项目开发指南11:axios请求与接口统一管理
    axios中文网:https://www.axios-http.cn/安装npminstallaxios配置在src下创建apis文件夹创建axios.js文件配置如下://src/apis/axios.jsimportaxiosfrom'axios';//创建axios实例constservice=axios.create({baseURL:"http://127.0.0.1:8080",//api的ba......
  • 2024年1月Java项目开发指南10:vite+Vue3项目创建
    新建项目安装routernpminstallvue-router在src下新建目录router,在目录下新建index.js在index.js里面配置路由import{createRouter,createWebHistory}from'vue-router';//定义路由constroutes=[//在这里配置路由];//创建路由实例constrouter=......
  • java中的ThreadLocal
    1.ThreadLocal的基本使用在Java的多线程并发执行过程中,为了保证多个线程对变量的安全访问,可以将变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立值,不会出现一个线程读取变量时而被另一个线程修改的现象。ThreadLocal类通常被翻译为线程本地变量类或者线程局部变......
  • Java方法详解
    Java方法详解1、何谓方法System.out.println(),那么它是什么呢?Java方法是语句的集合,他们在一起执行以一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法的程序中被创建,在其他地方被引用设计方法的原则:方法的本意是功能块,就是实现某个功......
  • 2024转行程序员的请注意:均月薪在40-70k
    前言2023年,对大多数行业来说都是不太好过的一年。对程序员来说也是如此,很多粉丝朋友都在说android工作特别难找,一个岗位都是几千份简历........大家心里都是特别的焦虑,本以为2024年就业情况会有好转,但实际上并非如此。没想到2024年的开启,却是硅谷大裁员!2024年才过了十几天,就传......
  • 使用 JavaScript 宏删除文档中的特定注释
    有时只需要删除文档中的注释,要怎么快速做到呢?在这篇文章中,我们将会展示如何为ONLYOFFICE创建一个简单的宏,来删除某些特定的或所有评论,从而保持协作的重点和整洁。什么是ONLYOFFICE 宏如果您是一名资深MicrosoftExcel用户,那么相信您已对于VBA宏非常熟悉了。这些宏是帮助您自......
  • 程序员有哪些必读书单,目前保存的分享一下
    1.数据结构与算法邓俊辉清华大学出版社2.设计模式可复用面向对象软件的基础China-Pub.comhttp://www.china-pub.com/ebook/英文版DesignPatternsElementsofReusableObject-OrientedSoftwareErichGammaRichardHelmRalphJohnsonJohVissides 3.职场救赎写给......
  • 了解Java事务管理
    在软件开发过程中,事务管理是一个非常重要的概念.事务用于确保数据库操作的一致性和完整性,并且具有原子性、一致性、隔离性和持久性的特性.Java提供了强大的事务管理机制,使得我们能够更好地处理数据的一致性和并发控制.Java事务管理主要通过JavaTransactionAPI(JTA)和Java......
  • Java学习日记 Day11
    Maven:把maven课程速通了,比较简单,其实就是对工程框架的一个配置,可以用一个总pom文件让整个工程的版本得到确定。SpringMVC:是Servlet的plus版,今天开了个头,明天继续学。算法:①二叉树的所有路径:递归加回溯,用一个List储存结果,一个双向队列储存路径。如果没遇到叶子节点就继续向里递......