1.类加载器的种类
2.双亲委派模型
3.垃圾回收
4.什么是垃圾
可达性分析算法
- 从GC Roots作为根对象开始,根据引用关系向下搜索,搜索走过的路程成为”引用链“,如果某个对象到GC Roots没有任何引用链相连,则这个对象是不可能再被使用(垃圾)
可作为GC Roots的对象
- 在虚拟机栈引用的对象,比如局部变量,临时变量等
- 方法区中的静态属性引用对象
- 方法区中常量引用对象
- 所有被同步锁Synchronized持有的对象
5.内存溢出OOM
当java虚拟机的堆内存不够,其原因可能有二:
- java虚拟机的堆内存设置不够
堆的大小不合理,比如要处理比较可观的数据量,但是没有显式的指定jvm堆大小或者指定数值偏小,我们可以通过参数-Xms、-Xmx来调整。
- 代码创建了大量对象,并且长时间不能被回收
6.内存泄漏
当对象不会再被使用到,但是GC又不能回收,这就是内存泄漏
- 例子
当一个变量是方法中的局部变量他的生命周期较短,但是如果定义为成员变量,甚至静态变量就是极大的拉长他的生命周期,大量的静态变量有可能导致内存泄漏
7.垃圾回收器
评价GC的性能指标
- 吞吐量
运行用户代码的时间占总运行时间的比例
- 暂停时间
执行垃圾收集时,程序的工作线程被暂停的时间,暂停时间越短越好
这两个指标是垃圾回收器最为关注的,但是"高吞吐量”和“低暂停时间”是一对相互竞争的目标
7.垃圾回收算法
-
一般用<可达性分析算法>判断对象是否存活。
-
分代收集理论
- 弱分代假说:绝大多数对象都是朝生夕灭
- 强分代假说:熬过越多次垃圾回收的对象就越难以消亡
- 跨带引用假说:跨带引用相对于同代引用只占极少数
根据分代收集理论,可以将java堆分为新生代和老年代两部分,在新生代中每次垃圾回收都有大量对象死去,每次回收的幸存者会移动至老年代。这也为后面的垃圾回收算法奠定了基础。
- 垃圾回收算法:
- 标记-清除:算法标记需要回收的对象,然后清除,会造成许多内存碎片
- 标记-整理:与标记-清除算法类似,但是在标记之后,会将活的对象移向另一边,然后清除边界之外的垃圾对象—适用于老年代
- 标记-复制:将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块,然后清空之前的区域—使用与年轻代
- 分代收集:算法将对象分为年轻代和老年代。年轻代每次需回收较多对象,采用标记复制算法。老年代每次回收较少对象,采用标记整理法
8.CMS垃圾回收器(并发收集、低延迟)
jdk14删除了cms垃圾回收器
9.G1垃圾收集器
在小内存应用上CMS性能优于G1,大内存应用G1优于CMS,这个优劣势的java堆平衡点通常在6GB-8GB
CMS是追求最短用户停顿时间,无法控制停顿时间,年轻代标记复制,老年代标记清除,会产生较多内存碎片,G1使用多region和rememberSet机制实现了停顿时间可以预测,并且减少了内存碎片