01 jvm面试10问

          https://www.cnblogs.com/it-deepinmind/p/12408911.html  (24个面试题)
 
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
posted @ 2020-08-27 21:49  菜鸟奔跑  阅读(85)  评论(0)    收藏  举报