搞了java两年多了,无意中看到淘宝架构师林昊写的一本java分布式应用上讲解的jvm。感觉写的挺好。特作此笔记、以备以后复习用。
jvm主要做了哪些呢?
1 java代码的执行
1.1 代码编译为class类
1.2 装载class ClassLoader
1.3执行class
2 内存的管理
2.1 内存空间
2.2 内存分配
2.3 内存回收
2.4 内存状况分析
3线程资源的同步和交互机制
3.1 线程资源同步
3.2 线程交互机制
3.3 线程状态及分析方法
下面第一篇先学习java 的代码编译吧
1.1 代码编译为class类
首先 编译命令为 javac 这个不用我多说大家都知道
说说javac的执行过程吧
1 分析和输入到符号表 这个翻译我本身不太满意,自己的理解是parse and enter应该理解为这样的 parse为解析 所做的就是词法和语法解析
词法解析完成的将字符串转换为Token树、语法解析就是将词法分析生成的token树生成为抽象语法树。
Enter 过程将符号输入到符号表,通常包括确定类的父类型和接口、根据需要添加默认构造器、将类中出现的符号输入到类自身的符号表中。
2 注释处理 该步骤主用处理用户自定义的注释 可能带来的好处是基于注释生成附加代码进行一些特殊检查,从而节省公用代码的编写。比如 spring-side中的xml 注释
@XML(property="")当使用该注释的字段可以自动的生成标准的xml格式字符串。
3 语义分析和生成class类
Analyse步骤是基于抽象语法树进行一系列的语义分析包括将语法树种的名字、表达式等元素和变量方法类型等关联到一圈检查便利使用前是否已经申明,总之检查代码的合法性另外对代码进行折叠和解除语法糖。
4最后完成语法分析后开始生产class文件 生成步骤:
a 首先将实例成员初始化其收集到构造器中,将静态成员初始化器守卫<client>() 接着将抽象语法树生成字节码 采用的方法为后续遍历语法树, 并进行最后的少量代码转换。比如将string转换为StringBuilder 最后从符号表生成class文件。
上述过程就是sun的jdk 将java文件转换为class文件的过程。
class文件中存放的都是什么呢?
1 结构信息 包括class文件格式版本号和各部分的数量与大小的信息
2 元数据 类/继承的父类/实现的接口的声明信息 域与方法声明信息和常量池
3 方法信息 字节码 异常处理表 求值栈的类型记录、调试用符号信息。