1. Java代码编译和执行的整个过程包含了三个重要的机制:
- Java源码编译机制
- 类加载机制
- 类执行机制
2. 关于Java源码编译机制
Java源码编译由以下三个过程组成:
- 分析和输入符号表
- 注解处理
- 语义分析和生成class文件
生成的class文件包括的信息有:
- 结构信息(class文件格式版本号以及各部分的数量和大小的信息)
- 元数据(源码中的声明与常量的信息,包括类继承的超类、实现接口的声明信息、域和方法声明信息及常量池)
- 方法信息(对应源码中语句和表达式的相关信息,包含自己吗、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息)
JVM的类加载时通过ClassLoader及其子类来完成的,类的层次关系和加载顺序如下图:
- BootStrap ClassLoader 负责加载$JAVA_HOME中的 jre/lib/rt.jar 里所有的 class,由 C++实现,不是ClassLoader的子类
- Extension ClassLoader 负责加载 Java 平台中扩展功能的一些 jar 包,包括 $JAVA_HOME 中 jre/lib/*.jar 或 -DJava.ext.dirs 指定目录下的jar包
- App ClassLoader 负责加载 classpath 中指定的jar包及目录中class
- Custom ClassLoader 属于应用程序根据自身需要定义的ClassLoader, 如 tomcat、jboss 都会根据 J2EE 规范自行实现 ClassLoader
3. Java 类执行机制
JVM是基于栈的体系结构来执行 Class 字节码的,线程创建之后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。
4. JVM内存组成结构
JVM内存由堆、栈、本地方法栈、方法去等部分组成
堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过 -Xmx 和 -Xms 来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Space 和 To Space 组成。
新生代:新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由 -Xmn来控制, 也可以用 --XX:SurvivorRatio 来控制 Eden 和 Survivor 的比例;
旧生代:用于存放新生代中经过多次垃圾回收仍然存活的对象
时间: 2024-10-06 00:30:40