Java学习-JVM-01
Java学习-JVM-01
1.Java类加载器
类加载器就是加载所有类的工具,它加载的类在内存中只有一份,所以类加载器是单例的。也就是堆中的Class对象不可以重复加载
主要有以下四类:
BootstrapClassLoader 启动类加载器:
加载/lib下的jar包和类。由C++编写。ExtenssionClassLoader 扩展类加载器:
加载/lib/ext下的jar包和类。由Java编写。AppClassLoader 应用类加载器:
加载当前classPath下的jar包和类。由Java编写。自定义类加载器:
通过继承java.lang.ClassLoader类,实现自定义类加载器。

2.双亲委派模型
当类加载器收到一个类的加载请求时,它首先不会自己尝试去加载它,而是把这个请求委托给父类加载器去完成,这样层层委派,因此所有的加载请求最终都会传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会自己尝试去加载。
双亲委派模型的具体实现代码在 java.lang.ClassLoader 类中。此类的 loadClass() 方法是双亲委派模型的核心:先检查类是否已经加载过,如果没有则让父类加载器去加载。当父类加载器加载失败时会抛出 ClassNotFoundException 异常,此时再自己尝试加载。
如果没有双亲委派模型,而是由各个类加载器自行加载的话,内存里面可能会出现很多个相同的类,那么类之间的比较结果及类的唯一性将无法保证。
3.GC如何判断对象可以被回收
引用计数法:
设置引用计数器,对象被引用时计数器加1,引用失效时计数器减1,当计数器为0时,对象可以被回收。会存在对象间循环引用的问题,一般不使用这种方法。可达性分析:
通过GC Roots 的根对象作为起始节点,从这些节点开始,根据引用关系向下搜索,如果某个对象没有被搜索到,则会被标记为垃圾。可作为GC Roots的对象有:- 虚拟机栈和本地方法栈中引用的对象
- 类静态属性引用的对象
- 常量引用的对象
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!