【2019秋冬】【面经】JVM

6 篇文章 0 订阅
4 篇文章 0 订阅

说一下 JVM 的主要组成部分?及其作用?
类加载器 把 Java 代码转换成字节码
运行时数据区 把字节码加载到内存中
执行引擎 将字节码翻译成底层系统指令
本地库接口

Java运行时数据区/内存区域
程序计数器
虚拟机栈 基本数据类型和对象引用
Java堆 对象实例及数组
本地方法栈 native方法
方法区 被虚拟机加载的类,静态变量,常量,编译后代码

判断常量是废弃常量
看这个常量是否还被引用

判断类是无用类
1.该类不存在任何实例
2.该类的类加载器已经被回收
3.无法通过反射的方法调用该类

垃圾收集算法,特点
1.标记清除
常用于老年代,把要回收的进行标记,标记完成后统一回收
2.标记整理
用于老年代,把存活的统一向一边移动,按边界清除回收
3.复制算法
分两半,当一半快满时,把存活的移动至另一半
4.分代算法
把Java堆分为新生代和老年代 1/3 2/3
新生代按8:1:1的Eden和Survivor,每次使用一个Eden和一个Survivor,当快满时,把所有存活的放入另一块Survivor,另外两块清空
新生代没更新一次就+1,当达到15时自动转化为老年代

HotSpot为什么要分老年代新生代
对不同的代可以采用不同的回收算法,效率更高

常见垃圾收集器
Serial 单线程,新生代
ParNew 多线程,新生代,和CMS一起用
Parallel Scavenge 多线程,新生代,考虑吞吐量
Serial Old 单线程,老生代
Parallel Old 多线程,老生代
CMS 老生代,初始标记,并发标记,重新标记,并发清理
G1 可以全部用,设置了优先级,按优先级回收 初始标记,并发标记,最终标记,筛选回收

Minor GC 和 Full GC区别
Minor GC是用于新生代,复制算法
Full GC是用于老生代,标记整理算法

Java创建对象过程
1.看类是否在常量池中,或者有没有被初始化过
2.将类的字段信息和方法信息存储到方法区
3.为类在Java堆上分配空间
4.对类的成员变量进行初始化
5.执行构造函数

对象访问定位的两种方式
直接访问模式,速度快
在Java堆中直接存放的就是对象地址

句柄模式,发生改变时只修改句柄即可
在Java堆中开辟一块内存放句柄,引用中存放的是句柄,句柄中存放的是地址

类加载机制
加载 把对应类的class文件加载到方法区
验证 验证class文件是否正确
准备 给静态变量分配内存空间
解析 将常量池内符号转为直接引用
初始化 对静态变量和静态块初始化赋值

类加载器
启动类加载器
扩展类加载器
应用程序类加载器

双亲委派模型
针对类加载器,当子类加载器收到请求时,会直接传给父类,直到最顶端的启动类加载器,如果顶端无法完成这个请求时,子类会进行实现

判断对象是否死亡
从GC root向下搜索,如果这个对象没有在引用链上,就可以被回收

引用计数器,有引用加一,无引用减一,零回收,无法解决循环引用问题

什么可以用来作为GC Root
静态变量,常量,native方法,虚拟机栈中引用的对象

强引用,弱引用,软引用,虚引用

强引用:永远不会被回收
软引用:空间不足时才回收
弱引用:当扫描发现只有弱引用时会回收
虚引用:最弱的引用,不决定对象生命周期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值