01 jvm面试10问
1.四个引用总结:
强-软-弱-虚
强-普通new,也就是平常的使用。
软-内存充足的时候不会被回收,当发生溢出的时候进行回收
虚-只能存活到下一次GC前,生命周期短
虚-创建了很快被回收,在被清理的时候会收到一个通知。
2.三个基础的清理算法:定义和优缺点
1.标记清除:需要清理的标记为0,不需要的为1,清理的时候一次性把标记为0的清理,
缺点:1.对象数量较多到时候,标记需要时间消耗。
2.容易造成空间碎片化
2.标记复制:为了减少空间碎片化,将空间分成2部分,一次只使用一部分,当使用1中的算法清理完毕之后,将剩下的对象复制到另一块空间中,这也就解决了碎片化。
缺点:复制时间长,影响效率
2.浪费了一半的空间(为了节约空间,使用理论,将空间划分为老年代和新生代,新生代:老年代=8:1,如此就不会过多的浪费空间)
3.标记整理:移动碎片,而不是完整的复制碎片,移动的代价小一点,它的提出是针对垃圾回收少,还剩下很多对象的情况,使用复制算法效率就低,还是使用移动算法更加高效。
3.常用的垃圾收集器
serial ,parallel scanvenge ,parNew 区别,串行,并行
cms: 老年代,使用标记-清除算法,执行分为四个过程,初始标记-并发标记-重新标记-并发清除。
同时伴随三个问题:1.cpu资源敏感;2.碎片化问题。3.无法清楚浮动垃圾。
G1: Jdk9的默认垃圾收集器,取消了分代,使用分块,标记-整理算法,但是块状还是需要比较年代。
4.jvm内存分布
线程私有的三个空间:虚拟机栈,本地方法栈,程序计数器,其中虚拟机栈进行程序运行,内容相对较多。
线程共享两个空间:方法区和堆,堆存放对象。
5.内存溢出情况
内存的溢出也对应上面的5个空间,但是大多数的溢出出现在堆种。
堆溢出: 对象太多,新生代,老年代,注意设置命令 -Xms,-Xmx,-Xmn
栈溢出:-Xss 设置栈大小,它的溢出包括了深度不够,局部变量表太大,或者线程太多
方法区溢出: 它涉及class太多,比如使用动态代理的时候,
常量池溢出:string字符串的存放太多
直接内存溢出:直接分配的内存,比较channel里面就会直接分配直接内存。
6.对象的布局
对象在堆中是如何存放的?主要分为三块
1.对象头,内容多且重要:包含了对象自身的运行时数据,gc分代年龄,锁状态,线程持有的锁等等,其次包括指中,
2.实例数据:对象的有效信息,父类中继承的内容等等,
3.对齐填充
7.类加载过程
加载-验证-准备-解析-初始化-使用-卸载
Loading
Linking{verification,preparation,resolution}
Initializing
ClassLoader概念
双亲委派机制
定义自己的ClassLoader
8.双亲委派机制
类的装载首先发给装载器的父类进行装载,父类再发给父类,父类无法装载,重新返回给子类进行装载,确保类被加载的一致性
9.Class文件存放
class文件结构
MagicNumber
ConstantPool
AccessFlags
Fields
Methods
常用工具
10.性能调优
1.调整内存空间布局
2.调整垃圾收集器
原则:减少FGC

浙公网安备 33010602011771号