JVM学习笔记(二)------Java代码编译和执行的整个过程
Java代码编译是由Java源码编译器来完成,流程图如下所示:
Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
Java代码编译和执行的整个过程包含了以下三个重要的机制:
- Java源码编译机制
- 类加载机制
- 类执行机制
Java源码编译机制
Java 源码编译由以下三个过程组成:
- 分析和输入到符号表
- 注解处理
- 语义分析和生成class文件
流程图如下所示:
最后生成的class文件由以下部分组成:
- 结构信息。包括class文件格式版本号及各部分的数量与大小的信息
- 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池
- 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息
类加载机制
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
1)Bootstrap ClassLoader
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
2)Extension ClassLoader
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
3)App ClassLoader
负责记载classpath中指定的jar包及目录中class
4)Custom ClassLoader
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
类执行机制
JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:
相关推荐
在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...
5. **卸载**:类的卸载通常发生在JVM关闭时,或者是垃圾回收机制认为不再需要某个类时。 #### 二、接口的初始化 接口的初始化过程与类相似,但有几个关键区别: - 接口不能使用`static`语句块,但编译器依然会为...
理解这些加载顺序对于优化代码性能和避免潜在问题至关重要,特别是在处理静态成员、初始化逻辑以及多线程环境下的类加载时。希望这个详尽的解释能帮助你更好地理解和应用Java中的类加载机制。如有任何疑问,欢迎继续...
此外,类的卸载在Java中相对复杂,通常只有在以下情况才会发生:类的加载器被垃圾收集器回收,且该类的所有实例都已被回收,同时系统中没有对该类的静态变量或静态方法的引用。 总结,Java 类加载器是JVM中的重要...
2. 垃圾回收类型:Java 中有多种垃圾回收类型,包括分代复制垃圾回收、标记垃圾回收和增量垃圾回收等。 3. 手动执行垃圾回收:可以使用 System.gc() 方法手动执行垃圾回收,但这只是一个提示,垃圾回收器并不保证...
实体不再被使用,会在不确定的时间内被垃圾回收器回收(垃圾回收机制)。 方法区、本地方法区、寄存器验证加载顺序加载顺序父类静态变量父类静态变量 = 1 父类非静态变量父类非静态变量 = 1 子类静态变量子类静态...
Java虚拟机(JVM)是Java程序运行的核心,它的内存管理和垃圾回收机制对于程序的高效运行至关重要。在本文中,我们将深入探讨JVM的类加载子系统及其在内存管理中的作用。 类加载子系统,也被称为Class Loader ...
例如,使用自定义类加载器实现按需加载,或者通过调整类路径和加载顺序,避免不必要的类加载。 7. **类加载异常处理** 在加载过程中,如果遇到类找不到、类格式错误等问题,JVM会抛出ClassNotFoundException、...
类加载器分为启动类加载器、扩展类加载器和应用程序类加载器,它们遵循双亲委派模型确保Java平台的稳定运行。OSGi是一种基于Java的动态模型系统,支持模块化编程和热插拔。 以上总结的Java知识点,无论是对于准备...
JVM是Java的核心,涉及到内存区域的划分、垃圾回收机制和类加载机制。 首先,JVM内存区域分为:程序计数器、虚拟机栈、本地方法区、堆和方法区。程序计数器、虚拟机栈、本地方法区都是线程私有的,堆和方法区则是...
1. 类加载机制:JVM如何加载类文件并创建类的实例,类的加载顺序和双亲委派模型等。 2. 内存管理:JVM内存区域的划分,包括堆、栈、方法区、程序计数器等区域的作用和管理方式,以及垃圾回收机制。 3. 执行引擎:...
5. **JVM内存管理**:面试中经常会问到JVM的内存结构(堆、栈、方法区、本地方法栈等),垃圾回收机制(GC),以及如何优化内存使用。理解内存分配和回收对于解决性能问题至关重要。 6. **异常处理**:Java中的异常...
了解Java类的概念,对象、引用、this关键字的作用,类包的概念等,能够熟练使用类加载、类方法、类成员变量、类构造器等。 6. 抽象类与接口: 了解Java抽象类和接口的概念,能够使用抽象类和接口进行编程。 7. 内部...
9. **JVM垃圾回收器和算法**: - G1分带:将内存分为新生代和老年代,采用不同的垃圾回收策略。 - YGC(年轻代GC):主要针对新生代,采用复制算法。 - OGC(老年代GC):处理老年代的垃圾,通常采用标记-压缩或...
JAVA集合框架主要包括List、Set和Map三个接口,分别用于存储顺序列表、无序集合和键值对映射表。List接口的实现类有ArrayList(基于数组实现)、Vector(线程同步的数组实现)和LinkedList(基于链表实现)。Set接口...
Java Manager展示了不同类加载器加载的类,有助于理解类的加载顺序和作用域。 5. **性能指标**:监控GC(Garbage Collection)频率和耗时,以及方法调用的热点,可以帮助优化应用的性能。 6. **JMX(Java ...
Java集合框架提供了一套性能优化、线程安全的接口和类,用于存储和操作对象集合。集合框架主要包括List、Set和Map三大接口,分别对应顺序列表、无序集合和键值对映射。其中,ArrayList、Vector和LinkedList实现了...
类的加载顺序按照这个层级结构进行,每个类加载器在加载类时,首先会检查请求加载的类是否已经被加载过,如果已加载,则返回给请求者;如果未加载,它会将请求委派给父类加载器,如此循环,直到启动类加载器。如果...
2. **实时类加载器**:实时系统需要在运行时动态加载和更新代码,实时类加载器能够快速且可靠地完成这项工作,避免了常规类加载可能导致的系统暂停。 3. **优先级调度**:Java线程可以被赋予不同的优先级,以确保高...