补充:
1. GC流程:Eden区->Survivor区->old区
流程图如下
2. 垃圾回收算法
哪些对象算是垃圾,怎么看?
a. 引用计数法
在应用程序中持有该对象的引用,则不是垃圾,否则是
b. 可达性分析
应用GC ROOT作为引用,向下寻找,看某个对象是否可达
算法:
a. 标记-清除
缺点:空间碎片不连续
b. 标记-整理
c. 标记-复制
缺点:耗时
垃圾收集器:
串行:serial和serial old
并行:parallel 和parallel old
以上两种都是在回收时,需要停止应用程序
并发:CMS和G1
在回收时,不需要停止应用程序
3. 类加载器
Java到装载到内存的过程
Java源文件到class文件(javac)
Class文件到装载的内存(用类加载器)
类加载器:负责java字节码,将其转换成java.lang.Class类实例的模块代码
类加载步骤:
1.装载
2.链接
a.验证 魔数开头16进制cafebabe开头,版本号是否正确
b.准备 为类变量分配内存,设置类变量的默认值
c.解析 把符号引用转化为直接引用 符号引用就是用符号表示的目标
3.初始化
实例变量初始化
4.使用
5.卸载
类加载类型:
启动类类加载器
扩展类加载器
应用程序类加载器
自定义类加载器
类加载的几种方式:
1.全盘负责 2.双亲委派 3.缓存机制
双亲委派:
用类加载器加载java字节流时,会先调用父类类加载器,若父类类加载器不能加载,只能用当前类加载器进行加载
如果子类加载器没有加载过该目标对象,则先委托父类加载器加载该目标对象,若父类加载器找不到该字节码文件的情况下,才由该子类加载器进行加载。
Java建议使用双亲委派,但不是强制。
打破双亲委派的几种方式:
- SPI(service provider interface):服务发现机制,jdk提供接口规范,产商根据接口面向接口编程实现该规范
- Osgi:热部署,热加载