深入浅知JVM(面试必备)

JVM

  • Java虚拟机
  • 意义:跨平台
  • 把Java字节码转换成操作系统/CPU能够识别的二进制指令

JVM区域内存划分

  1. 方法区
  2. 程序计数器

JVM做的事情:

  1. 类加载
  2. 执行引擎(解释执行字节码)
  3. 动态内存管理(申请内存/释放内存)----》 垃圾回收机制(GC)

垃圾回收机制

  1. 啥时候申请内存(时机是明确的)new对象
  2. 啥时候释放内存(时机是隐晦的)需要仔细分析代码,代码啥时候不使用对象,就可以释放了

垃圾回收机制的目的:

  • 为了能够自动判定某个对象是否应该回收,如果能够回收就回收

垃圾回收机制的识别

  • 引用计数
  • 可达性分析(Java采取的方式)
    • 从GCRoots出发,能够访问到对象就是“可达的”,不能够访问到的对象“不可达的”,一旦某个对象不可达,此时就会导致这个对象持有的引用指向其他对象也就不可达了

GCRoot从哪里开始遍历

  • 栈上的局部变量表中的引用
  • 常量池中的引用指向的对象
  • 方法区中的静态的引用类型的属性

GC中的算法:

  1. 标记清除
    • 先标记垃圾,再清除垃圾
    • 方式:可达性分析,可达的对象刨除,剩下的就标记成垃圾
    • 清除的含义:释放对象对应的内存空间
    • 缺点:可能产生很多内存碎片(JVM和操作系统已经做了善后工作)
  2. 复制算法
    • 解决内存碎片问题
    • 优点:很好解决了内存碎片问题
    • 缺点:有局限性,如果留下的对象多,可能会低效;内存利用率不高,要切出来一半
  3. 标记整理
    • 类似于顺序表删除中间元素的方式,搬运
    • 优点:没有内存碎片,空间利用率也高了
    • 缺点:内存搬运操作比较频繁,效率不高
  4. 分代回收
    • 把回收的过程分成几个场景,不同的场景采取不同的回收方式
    • 核心思路:根据对象的年龄来预测生命周期是长还是短,认为年龄越大,生命周期机会更长,年龄越小,生命周期越短

类加载

  • JVM把.class文件内容加载到内存中
  • 类加载步骤:
    1. 加载:找到.class文件,解析.class文件的格式,读取到内存中
    2. 链接:类和类之间需要配合,就需要把依赖的类也进行加载
    3. 初始化:对类对象进行初始化(初始化静态成员,执行静态代码块)

双亲委派模型/双亲委派模式

  • 负责类加载工作的模块称为类加载器
  • JVM工作过程中,会有很多类加载器一起工作,这些类加载器默认有父子关系
  • 一个类加载器只有一个父亲,没有多个

双亲委派模型具体工作过程:

  • BootstrapClassLoader 用来加载Java标准库中的类,string,ArrayList(爷爷)
  • ExtensionClassLoader 用来加载一些JVM扩展出来的类(父亲)
  • ApplicationClassLoader 加载用户自定义的类的类加载器(儿子)
  • 目的:防止出现用户写的类和标准库的类重名的情况,导致加载出错

你可能感兴趣的:(笔记,面试,java)