本文主要涉及三方面内容
1.jvm整体结构;
2.java代码的编译和执行过程;
3.内存管理和垃圾回收;
(一)废话不多说,直接上图

上图为JVM整体组成结构,有几个模块组成:
1.class文件生成模块:通过jdk自带的javac编译命令生成(之前文章有详细介绍)

中间过程就是javac编译程序内部处理的过程,核心就是针对源代码词法和语法的分析。
2.类加载器子系统模块:JVM运行时自动创建,作用是将class字节码加载到jvm对应的内存中。类加载的核心就是classLoader,classLoader也是动态加载技术的核心。classLoader在此不作详细介绍下一章再总结。
classLoader将class字节码加载到jvm内存中如下图

上图为jvm提供的几种加载器
Eclipse中可以 动态加载一些jar可以拓展eclipse的功能,原理就是jvm提供了一个Custom ClassLoader的功能,让我们可以加载指定jar包中的字节码文件,拓展应用的功能,从而实现动态加载。android中继承了jvm的这一特性,所以android也可以实现动态加载功能(之后也会详细介绍android中基于此动态加载技术的热修复、热更新、组件化的内容)。
3.内存空间模块:分为四个部分,分别存储class字节码不同的部分。过程如下图:

Loading:从文件中获取类的信息并且载入到JVM的内存中
Verifying:检查读入的结构是否符合JVM规范的描述
Preparing:分配一个结构用来存储类信息
Resolving:把这个类的常量池中的所有的符号引用改变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值。所以在源java代码中写的static修饰的属性不会把值立即赋值给这个属性,它会执行Loading、Verifying、Preparing、Resolving等步骤之后再进行初始化。
4.垃圾回收模块
5.其它模块:如指令集、执行引擎、本地方法接口等等,都属于jvm底层与CPU打交道的暂时不用深入。
下一章节:内存管理和垃圾回收:
网友评论