点击上方“后端开发技术”,选择“设为星标”
优质文章和资源,及时送达
JVM面试题
关于JVM以及垃圾回收的内容,在之前的三篇文章中已经做过了详细讲解,请看。
对于下面面试题中的知识点,基本都可以在之前三篇文章中找到答案。
1.JVM内存模型,GC机制和原理;
2.GC分哪两种,Minor GC 和Full GC有什么区别?
3.什么时候会触发Full GC?分别采用什么算法?
4.JVM里的有几种classloader,为什么会有多种?
5.什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;
6.什么情况下我们需要破坏双亲委派模型;
7.常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
8.JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class文件结构是如何解析的
10.Java对象创建过程
1.JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)
2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)
3.将除对象头外的对象内存空间初始化为04.对对象头进行必要设置
11.类的生命周期
类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程
加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象 连接,连接又包含三块内容:验证、准备、解析。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用 初始化,为类的静态变量赋予正确的初始值 使用,new出对象程序中使用 卸载,执行垃圾回收
12.Java对象结构 Java对象由三个部分组成:对象头、实例数据、对齐填充。对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的) 对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)
13.Java对象的定位方式 句柄池、直接指针。
14.如何判断对象可以被回收?
判断对象是否存活一般有两种方式:引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。
15.JVM的永久代中会发生垃圾回收么?
垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)
16.引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收 弱引用:描述有用但不是必须的对象,在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。
◆ ◆ ◆ ◆ ◆
关注并后台回复 “面试” 或者 “视频”,
即可免费获取最新2019BAT
大厂面试题和大数据微服务视频
您的分享和支持是我更新的动力
·END·