深入浅知JVM(面试必备)
Posted 可乐好哇!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅知JVM(面试必备)相关的知识,希望对你有一定的参考价值。
JVM
- Java虚拟机
- 意义:跨平台
- 把Java字节码转换成操作系统/CPU能够识别的二进制指令
JVM区域内存划分
- 堆
- 方法区
- 栈
- 程序计数器
JVM做的事情:
- 类加载
- 执行引擎(解释执行字节码)
- 动态内存管理(申请内存/释放内存)----》 垃圾回收机制(GC)
垃圾回收机制
- 啥时候申请内存(时机是明确的)new对象
- 啥时候释放内存(时机是隐晦的)需要仔细分析代码,代码啥时候不使用对象,就可以释放了
垃圾回收机制的目的:
- 为了能够自动判定某个对象是否应该回收,如果能够回收就回收
垃圾回收机制的识别
- 引用计数
- 可达性分析(Java采取的方式)
- 从GCRoots出发,能够访问到对象就是“可达的”,不能够访问到的对象“不可达的”,一旦某个对象不可达,此时就会导致这个对象持有的引用指向其他对象也就不可达了
GCRoot从哪里开始遍历
- 栈上的局部变量表中的引用
- 常量池中的引用指向的对象
- 方法区中的静态的引用类型的属性
GC中的算法:
- 标记清除
- 先标记垃圾,再清除垃圾
- 方式:可达性分析,可达的对象刨除,剩下的就标记成垃圾
- 清除的含义:释放对象对应的内存空间
- 缺点:可能产生很多内存碎片(JVM和操作系统已经做了善后工作)
- 复制算法
- 解决内存碎片问题
- 优点:很好解决了内存碎片问题
- 缺点:有局限性,如果留下的对象多,可能会低效;内存利用率不高,要切出来一半
- 标记整理
- 类似于顺序表删除中间元素的方式,搬运
- 优点:没有内存碎片,空间利用率也高了
- 缺点:内存搬运操作比较频繁,效率不高
- 分代回收
- 把回收的过程分成几个场景,不同的场景采取不同的回收方式
- 核心思路:根据对象的年龄来预测生命周期是长还是短,认为年龄越大,生命周期机会更长,年龄越小,生命周期越短
类加载
- JVM把.class文件内容加载到内存中
- 类加载步骤:
- 加载:找到.class文件,解析.class文件的格式,读取到内存中
- 链接:类和类之间需要配合,就需要把依赖的类也进行加载
- 初始化:对类对象进行初始化(初始化静态成员,执行静态代码块)
双亲委派模型/双亲委派模式
- 负责类加载工作的模块称为类加载器
- JVM工作过程中,会有很多类加载器一起工作,这些类加载器默认有父子关系
- 一个类加载器只有一个父亲,没有多个
双亲委派模型具体工作过程:
- BootstrapClassLoader 用来加载Java标准库中的类,string,ArrayList(爷爷)
- ExtensionClassLoader 用来加载一些JVM扩展出来的类(父亲)
- ApplicationClassLoader 加载用户自定义的类的类加载器(儿子)
- 目的:防止出现用户写的类和标准库的类重名的情况,导致加载出错
以上是关于深入浅知JVM(面试必备)的主要内容,如果未能解决你的问题,请参考以下文章