1.JVM三个主要子系统:类加载子系统,运行时数据区,执行引擎
2.类加载子系统:加载、验证、准备、解析、初始化、使用、卸载
加载:将class文件从磁盘督导内存
验证:验证字节码文件的正确性
准备:给类的静态变量分配内存并赋予默认值
解析:类加载器装入类所引用的其他所有类
初始化:为类的静态变量赋予正确的初始值,执行类的静态代码块
3.类加载器种类:①启动类加载器(Bootstrap Classloader)负责加载JRE的核心类库②扩展类加载器(Extension Classloader)负责加载JRE扩展ext目录下的包③系统类加载器(Application Classloader)负责加载classpath路径下的类包④用户自定义类加器(User classloader)负责加载用户自定义路径下的类包。
4.类加载机制:全盘负责委托机制、双亲委派机制
全盘负责委托机制:当一个classLoader加载一个类的时候,除非显示的使用另一个classLoader该类所依赖和引用的类也是用它加载。
双亲委派机制:指先委托父类加载器寻找目标类,在找不到的情况下再自己的路径中查找并加载。优势:①沙箱安全机制:比如自己写的String.class类不会被加载,这样可以防止核心类库被修改②避免类的重复加载:当父classloader已经加载了改类的时候,就不需要子类再去加载了。
5.判断对象是否可用的方法:①引用计数法:缺点无法解决对象循环引用的问题②可达性分析算法:通过一系列的成为"GC Roots的对象作为起点,从这些节点开始向下搜索,节点所走过的路径,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。GC Roots根节点:类加载器、Thread、虚拟机栈的局部变量表、static成员、常量引用、本地方法栈的常量等等。
6.如何判断一个常量是废弃常量?
运行时常量池主要回收的是废弃的常量,那么,我们怎么判断一个常量是废弃常量?假如在常量池中存在字符串"abc",如果当前没有任何string对象引用该字符串常量的话,就说明常量abc就是废弃常量。
7.如何判断一个类是无用的类?
满足三个条件:①该类的所有实例都已经被回收,也就是java堆中不存在该类的任何实例②加载该类的classLoader已经被回收③该类对应的java.lang.Class对象没有字任何地方被引用,无法在任何地方通过反射访问该类的方法。使类复活可以重写finalize()方法,只能自救一次。
8、垃圾回收算法:①复制算法(from,to区使用)②标记-清除算法(eden区使用)③标记整理算法(老年代使用)④分代收集算法
9.CMS垃圾收集器
9.怎么选择垃圾收集器?
①优先调整堆的大小让服务器自己来选择②如果内存小于100m,使用串行收集器③如果是单核,并且没有停顿时间的要求,串行或让JVM自己来选择④如果允许停顿时间超过1秒,选择并行或者JVM自己选择⑤如果响应时间最重要,并且不能超过1秒,使用并发收集器。