什么是class文件?java
可以被jvm识别,加载并执行的文件格式android
如何生成一个class文件算法
class文件的做用 记录类文件的全部信息(记录了this super 等关键字)缓存
class文件弊端服务器
什么是dex文件app
被DVM虚拟机识别,加载并执行的文件格式jvm
如何生成dex文件ide
javac -target 1.6 -source 1.6 Test.java
生成class文件。ps:指定1.6 版本为了保证兼容dx --dex --output=Test.dex com/example/hostfit/Test.class
ps: 是根据全类名来找的adb push Test.dex '手机路径(例如:/sdcard)'
dalvikvm -cp Test.dex com.example.hostfit.Test
ps: 注意全类名dex文件的做用ui
记录整个工程中全部类文件的信息。
java 虚拟机结构解析
java代码的编译和执行过程
Java 内存管理
Java 栈区
用来存放Java方法执行的全部数据 ps: method call-> a -> b - c;栈区由栈帧组成,一个栈帧表明一个方法的执行。
那什么是栈帧呢?每个方法从调用到执行完成就对应一个栈帧在虚拟机中入栈到出栈。每个栈帧包括局部变量表、栈操做数、动态连接、方法出口。例如(StackOverFlow异常)
本地方法栈:和Java方法栈一模一样,只不过本地方法栈是专门为Native方法服务的
方法区
存储被虚拟机加载的类信息,常量,静态变量,便是编译器后等数据,用于占据内存的
Java堆
全部经过New建立的对象的内存都在堆中分配,是虚拟机中最大的一块内存,是GC 要回收的部分
特色:Young Old Generation 能够动态分配,当咱们的服务器处理的是及时通信相关服务,就能够将Young Generation内存区域调整大一些;当咱们不须要频繁去建立对象的时候,能够将Young Generation 内存区域调整小一些,这样达到内存对象常驻的效果
Java 内存回收机制
垃圾回收算法
引用类型
强引用、弱引用、软引用、虚引用
如何回收垃圾
触发回收机制
Dalvik 与 jvm的不一样
ART比Dalvik有哪些优点
类是如何加载到虚拟机的?
Java 中的ClassLoader回顾
Android中ClassLoader 做用详解
Android ClassLoader的种类
BootsClassLoader
用来加载Android framework层的一些dex文件
PathClassLoader
用来加载已经安装到系统中的apk文件中的dex文件
DexClassLoader
用来加载指定目录中dex文件
BaseDexClassLoader
是PathClassLoader DexClassLoader 的父类
一个App至少须要BootClassLoader 和PathClassLoader
Android ClassLoader 的特色
双亲代理模型特色
当前的classLoader去加载此类,若是当前此类已经被ClassLoader加载过就再也不加载,直接返回; 若是未加载,便会查询它的Parents 是否加载过此类,若是加载过 就返回parents加载过的字节码文件; 若是整个继承线的都没有加载过此类,便会子类真正的加载,提升类加载效率。这样就会带来如下两个做用
类加载的共享功能 一些FrameWork层级的类 ,一旦被顶层的classLoader加载过,那么它就会缓存到内存里面,之后任何地方用到,就不用从新加载了
类加载的隔离功能 不一样继承路线上的ClassLoader 加载的类不是同一个类,避免开发者本身写一代码伪形成系统的类库来访问咱们系统可见成员变量。例如:系统层级的类通常初始化的时候就会加载,好比java.lang.String, 应用程序启动以前就会被系统加载,若是在一个app里面写一个自定String 替换掉java.lang.String 会形成严重的安全问题。判断是不是同一个类判断,除了className packageName 另外还须要是同一个ClassLoader加载的。
ClassLoader 源码 (加载流程)
ClassLoader loadClass 首先判断被本身或者双亲加载过,若是未加载过,调用BaseDexClassLoader 的findClass,调用DexPathList findClass ,而且完成将dex文件转换成DexFile ,转换成Elements, 遍历数据,调用DexFile loadClassBinaryName - > native
Android 中动态加载要点?