(一、二)垃圾回收机制。
根据各个不同公司,JVM垃圾回收机制会不同。 我们大都用sun公司的实例,下面我们以sun公司的JVM为例 。
(1.0)判断对象是否死亡算法。
1. 可达性分析算法。垃圾回收线程(查找)---->"根集"【就是当前运行的线程中,可以访问的引用变量的集合】(eg:当前函数的参数和局部变量,当前类的成员变量等等)---->垃圾回收线程(查找"根集"的直接引用)--->组成的对象 结合(循环重复上述步骤)---->找到所有对象。
①根集遍历可达到--->有效对象。
②根集遍历不可达到--->失效对象(垃圾)。
【扩充:①引用计数算法②可达性分析算法】
(2.0)垃圾回收的算法。
1. 分代收集算法。 分为①年老代【不常进行,CPU开销大】②年轻代【经常进行,CPU开销小】
【扩充:①标记-清楚算法。②复制算法③标记-整理算法④分代收集算法】
(三)类的加载过程。详情请关注---: 类的加载过程详解
双亲委派模型是什么【JDK1.2之前没有】(转)?图示:
首先,得知道一个概念:自定义加载器。(JVM规范 所有继承了抽象类java.lang.ClassLoader的类加载器:定义为自定义加载器)
【重写其findClass()方法:】
方法 说明
getParent() 返回该类加载器的父类加载器。
loadClass(String name) 加载名称为 二进制名称为name 的类,返回的结果是 java.lang.Class 类的实例。
findClass(String name) 查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findLoadedClass(String name) 查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。
resolveClass(Class<?> c) 链接指定的 Java 类
双亲委派过程:当一个类加载器收到类加载任务时,立即将任务委派给它的父类加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行;
除了启动类加载器以外,每个类加载器拥有一个父类加载器,用户的自定义类加载器的父类加载器是AppClassLoader;
双亲委派模型可以保证全限名指定的类,只被加载一次;
双亲委派模型不具有强制性约束,是Java设计者推荐的类加载器实现方式;
(四)有哪些类加载器。
1.0 启动类加载器(Bootstrap ClassLoader):由C++语言实现,直接嵌在JVM内核上,JVM启动它就启动了。
负责:加载JAVA_HOME\lib目录中并且能被虚拟机识别的类库到JVM内存中,如果名称不符合的类库即使放在lib目录中也不会被加载。该类加载器无法被Java程序直接引用。
2.0 拓展类加载器(Extension ClassLoader):该加载器主要是负责加载JAVA_HOME\lib\,该加载器可以被开发者直接使用。
3.0 应用程序类加载器(Application ClassLoader):该类加载器也称为系统类加载器,它负责加载用户类路径(Classpath)上所指定的类库,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
【注意:】他们之间的关系: