4.JVM面试题
帅地的jvm面试题有点深
1.运行时常量池和符号引用得看看。运行时常量池是方法区的一部分,运行时常量池存放:编译期生成的各种字面量和符号引用
2.jdk1.7 字符串常量池从方法区移到了堆中(原来运行时常量池包含字符串常量池),运行时常量池还在方法区中
3.G1垃圾收集器作用于新生代和老年代
4.对于byte,short,int,long,char类型的变量,数值在[-128,127]之间,会包装到缓存中(运行时常量池)。在常量池中,相同数值的常量只会保留一份
5.两个字面量的字符串连接后才可以放入字符串常量池,符号引用类型的字符串连接不会放入常量池
6.根搜索算法:以一系列GC Roots作为根节点向下搜索,如果哪个对象没有到GC Roots的引用链,那么这个对象就是垃圾对象
7.
(1)方法区:异常情况:OOM
(2)堆:异常情况:OOM
(3)虚拟机栈:为执行java方法而服务,异常情况:OOM,StackOverFlowError
(4)本地方法栈:为执行本地方法而服务,异常情况:OOM,StackOverFlowError
(5)程序计数器:存放的是虚拟机字节码指令的地址。可以看做是线程所执行的字节码指令的行号指示器。次区域是唯一一个不会抛出OOM的区域
字节码解释器的工作就是:通过改变程序计数器的值来选取下一条需要执行的字节码指令
8.对象访问定位的两种方式
(1)句柄:如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,引用中存储的就是对象的句柄地址,而句
柄中包含了对象实例数据与类型数据各自的具体地址信息
(2)直接指针:如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何防止访问类型数据的相关信息, reference 中存
储的直接就是对象的地址
优缺点:
(1) 使⽤句柄来访问的最大好处是引用中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指
针,而引用本身不需要修改;
(2)使用直接指针访问方式最大的好处就是速度快,它节省了了一次指针定位的时间开销
9.别标记为垃圾的对象一定会被回收吗
不一定。一个对象要想被垃圾回收器回收,至少需要两次标记
第一次标记:如何一个对象在经过根搜索后没有与GC Roots的引用链,会被第一次标记
第二次标记:第一次标记后会进行一次筛选,没有重新与引用链建立关联的,会被第二次标记
第二次被标记的对象会被垃圾回收器回收
10.java中的引用分为4种:强引用,软引用,弱引用,虚引用。引用强度依次递减
11.为什么要采用分代收集算法?
根本原因:不同的对象生命周期是不一样的。采用分代收集算法,可以提高垃圾回收效率
12.双亲委派机制的工作过程
当一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是将加载请求委托给父类加载器,因此所有的加载请求最终都会到启动类加载器中。只有当父类加载器反馈无法完成这个加载请求时,子类加载器才会尝试自己去加载
13.String.intern()方法可以看一看