1.JVM运行时内存划分区域
方法区:线程公有;
堆:线程公有;
虚拟机栈:线程私有;
本地方法栈:线程私有;
程序计数器:线程私有;
2.类加载器分类
启动类加载器;
拓展类加载器;
应用程序加载器;
用户自定义加载器;
3.类加载的步骤
加载;
链接:
验证、准备、解析;
初始化;
4.双亲委派机制
当一个类收到了类加载请求,它首先不会自己尝试去加载这个类,而是把这个请求交给父类去完成,每一个层次的类加载器都是如此,只有当父类完成了这个请求的时候子类才会尝试自己加载;
5.对象的内存结构
对象头、实例数据、对齐填充;
6.什么是垃圾回收
将一些不可达的对象进行清理回收;
7.如何判断对象是否可以回收
两种方式:引用计数法、可达性分析;
引用计数法:给对象添加一个引用计数器,每当有一个对象引用时就+1,引用失效时就-1,任何时刻对象计数器为0的对象就是可被回收的对象;
可达性分析:通过一系列称为 GC Roots 的对象作为起始点,从这些点向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则认为对象不可达。
即使在可达性分析中不可达的对象,也并非是非死不可,只是处于缓刑阶段,要真正死亡至少要经历两次标记,这跟 finalize 有关;
8.需要GC的内存区域
堆和方法区:在程序运行期间,这部分的内存的分配和使用都是动态的;
9.什么时候触发GC
程序调用System.gc()可以触发gc;
当Eden区和From Space区不足时,系统则会自动启动gc;
10.GC的常用算法
标记-清除算法;
标记-压缩算法;
复制算法;
分代收集算法;