没有合适的资源?快使用搜索试试~ 我知道了~
JVM中编译Class、内存回收、多线程原理和使用
需积分: 0 0 下载量 112 浏览量
2023-04-11
21:56:24
上传
评论
收藏 608KB DOCX 举报
温馨提示
试读
119页
JVM负责装载class文件并执行,因此,首先是JDK如何将Java代码编译为class文件、如何装载class文件及如何执行class,将源码编译为class文件的实现取决于各个JVM实现或各种源码编译器。class文件通常由类加载器(ClassLoader)来完成加载;class的执行在Sun JDK中有解释执行和编译为机器码执行两种方式,其中编译为机器码又分为client和server两种模式。Sun JDK为了提升class的执行效率,对于解释执行和编译为机器码执行都设置了很多的优化策略。 Java程序无须显式分配和回收内存,因此JVM如何进行内存的分配和回收也是要关注的问题。 JVM提供了多线程支持,对于分布式Java应用而言,通常要借助线程来实现高并发,JVM中线程资源如何同步的机制及线程之间交互的机制。
资源推荐
资源详情
资源评论
JVM 负责装载 class 文件并执行,因此,首先要掌握
的是 JDK 如何将 Java 代码编译为 class 文件、如何装
载 class 文件及如何执行 class,将源码编译为 class
文件的实现取决于各个 JVM 实现或各种源码编译器。
class 文件通常由类加载器(ClassLoader)来完成加
载;class 的执行在 Sun JDK 中有解释执行和编译为机
器码执行两种方式,其中编译为机器码又分为 client
和 server 两种模式。Sun JDK 为了提升 class 的执行
效率,对于解释执行和编译为机器码执行都设置了很
多的优化策略。
Java 程序无须显式分配和回收内存,因此 JVM 如何进
行内存的分配和回收也是要关注的问题。
JVM 提供了多线程支持,对于分布式 Java 应用而言,
通常要借助线程来实现高并发,因此 JVM 中线程资源
同步的机制及线程之间交互的机制也是需要掌握的。
Java 代码的执行机制
要在 JVM 中执行 Java 代码,首先要编译为 class
文件。下面介绍 Sun JDK 是如何将 Java 代码编译为
class 文件的,这种机制通常称为 Java 源码编译机制。
Java 源码编译机制(1)
JVM 规范中定义了 class 文件的格式,但并未定义 Java
源码如何编译为 class 文件,各厂商在实现 JDK 时通
常会将符合 Java 语言规范的源码编译为 class 文件的
编译器,例如在 Sun JDK 中就是 javac,javac 将 Java
源码编译为 class 文件的步骤
下面简单介绍以上三个步骤:
1. 分析和输入到符号表(Parse and Enter)
Parse 过程所做的为词法和语法分析。词法分析
(com.sun.tools.javac.parser.Scanner)要完成的
是将代码字符串转变为 token 序列(例如
Token.EQ(name:=));语法分析
(com.sun.tools.javac.parser.Parser)要完成的是
根据语法由 token 序列生成抽象语法树 。
Enter(com.sun.tools.javac.comp.Enter)过程为将
符号输入到符号表,通常包括确定类的超类型和接口、
根据需要添加默认构造器、将类中出现的符号输入类
自身的符号表中等。
2. 注解处理(Annotation Processing)
该步骤主要用于处理用户自定义的 annotation,可能
带来的好处是基于 annotation 来生成附加的代码或
进行一些特殊的检查,从而节省一些共用的代码的编
写,例如当采用 Lombok 时,可编写如下代码:
1. public class User{
2. private @Getter String usernam
e;
3. }
编译时引入 Lombok 对 User.java 进行编译后,再通过
javap 查看 class 文件可看到自动生成了 public
String getUsername()方法。
此功能基于 JSR 269 ,在 Sun JDK 6 中提供了支持,在
Annotation Processing 进行后,再次进入 Parse and
Enter 步骤。
3. 语义分析和生成 class 文件(Analyse and
Generate)
Analyse 步骤基于抽象语法树进行一系列的语义分析,
包括将语法树中的名字、表达式等元素与变量、方法、
类型等联系到一起;检查变量使用前是否已声明;推
导泛型方法的类型参数;检查类型匹配性;进行常量
折叠;检查所有语句都可到达;检查所有 checked
exception 都被捕获或抛出;检查变量的确定性赋值
(例如有返回值的方法必须确定有返回值);检查变
量的确定性不重复赋值(例如声明为 final 的变量
等);解除语法糖(消除 if(false) {…} 形式的无用
代码;将泛型 Java 转为普通 Java;将含有语法糖的
语法树改为含有简单语言结构的语法树,例如
foreach 循环、自动装箱/拆箱等)等。
在完成了语义分析后,开始生成 class 文件
(com.sun.tools.javac.jvm.Gen),生成的步骤为:
首先将实例成员初始化器收集到构造器中,将静态成
员初始化器收集为<clinit>();接着将抽象语法树生
成字节码,采用的方法为后序遍历语法树,并进行最
后的少量代码转换(例如 String 相加转变为
StringBuilder 操作);最后从符号表生成 class 文
件。
上面简单介绍了基于 javac 如何将 java 源码编译为
class 文件 ,除 javac 外,还可通过 ECJ(Eclipse
Compiler for Java) 或 Jikes 等编译器来将 Java 源
码编译为 class 文件。
class 文件中并不仅仅存放了字节码,还存放了很多
辅助 jvm 来执行 class 的附加信息,一个 class 文件
包含了以下信息。
结构信息
包括 class 文件格式版本号及各部分的数量与大小的
信息。
元数据
简单来说,可以认为元数据对应的就是 Java 源码中"
声明"与"常量"的信息,主要有:类/继承的超类/实现
的接口的声明信息、域(Field)与方法声明信息和常
量池。
剩余118页未读,继续阅读
资源评论
AE86Jag
- 粉丝: 43
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功