JVM面试题

12 篇文章 0 订阅
10 篇文章 4 订阅


序号内容链接地址
1JVM面试题https://blog.csdn.net/qq_42697271/article/details/114156410
2hibernate面试题https://blog.csdn.net/qq_42697271/article/details/115026946
3MySQL面试题https://blog.csdn.net/qq_42697271/article/details/115027076
4Redis面试题https://blog.csdn.net/qq_42697271/article/details/114038284
5zookeeper面试题https://blog.csdn.net/qq_42697271/article/details/113957764
6kafka面试题https://blog.csdn.net/qq_42697271/article/details/113934705
7RabbitMQ面试题https://blog.csdn.net/qq_42697271/article/details/113921930
8微服务面试题https://blog.csdn.net/qq_42697271/article/details/117694688

一、说一下 JVM 的主要组成部分?及其作用?

1、类加载器:将Java代码转化为字节码;
2、运行时数据区:将字节码放入内存;
3、执行引擎:将字节码翻译成底层系统指令;
4、本地方法库·:执行翻译出来的底层系统指令实现整个程序的功能;

二、说一下 JVM 运行时数据区?

运行时数据区有五个模块:
Java堆:Java堆是虚拟机中内存占用最大的一块,是被所有线程共享的,几乎所有对象的实例都在这里分配内存;
Java虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
本地方法栈:与虚拟机栈的作用是一致的,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用native方法服务的;
程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。
方法区(元空间):很早之前也称之为永久区,它主要用来存放常量、静态变量、类信息、即时编译后的代码等数据;

三、JVM为什么要设置STW机制?

主要是为了防止GC root检索垃圾对象时出现异常,因为对象的引用都是时刻变化的,停止整个世界的话对象的状态就不会时刻变动了。

四、说一下堆栈的区别?

功能方面:堆是用来存放对象的,栈是用来执行程序的;
共享性:堆是线程共享的,而栈是线程私有的;
存储大小的区别:堆得内存占用大小远远要大于栈的;

五、队列和栈是什么?有什么区别?

队列和栈都是用来预存储数据的
队列使用的是先进后出的策略,而栈使用的是先进先出的策略。

六、栈是用来干什么的?它的结构是怎么样的?

栈是用来存储局部变量的,也是用来运行程序的。
栈的内部主要有四个部分:局部变量表、操作数栈、动态链接、方法出口。
局部变量表:存储的是局部变量的信息。
操作数栈:是用来存储操作数的临时空间。
动态链接:是用来将符号变量转换成直接引用。
方法出口:存储的是代码接下来要执行区域的信息。

七、什么是双亲委派模型?

双亲委派模型指的是:当子类加载器要加载一个对象的时候,自己本身先不加载,而是让父类加载器去加载,每个加载器都这样操作,最终到达顶层的引导类加载器。如果父类无法找到该对象,才会让子类去加载。

八、说一下类装载的执行过程?

加载:根据查找路径找到相应的class文件然后导入
检查:检查加载的class文件的正确性
准备:给静态变量分配内存空间
解析:虚拟机将常量池的符号引用转换为直接引用的过程
初始化:对静态变量和静态代码块执行初始化工作

九、怎么判断对象是否可以被回收?

主要有两种方法:
1、引用计数器:给每一个对象都添加一个引用计数器,当对象被引用时计数器加一,当对象被取消引用时计数器减一,所以计数器为零的对象都可以被回收。
2、可达性分析:从GC root开始想下检索引用,检索的路径被称之为引用链,当一个对象和GC root之间没有引用链是,该对象就是垃圾对象可以被回收。

十、Java 中都有哪些引用类型?

主要有四种引用类型
强引用:该引用不会被GC回收。
软引用:有用但不是必须的对象,发生内存溢出之前会被回收。
弱引用:有用但不是必须的对象,在下一次GC的时候会被回收
虚引用(幽灵引用和幻影引用):无法使用虚引用获得对象,用PhantomReference实现虚引用,虚引用的用途是在GC时返回一个通知

十一、说一下 JVM 有哪些垃圾回收算法?

标记-清楚法:给垃圾对象加上标记,然后清除标记对象。
标记-整理法:将有用的对象向空间的一边聚集,然后在一个限定范围类,清除另一边的垃圾对象。
复制算法:将内存空间分为两个区域,将有用的对象复制到另一个区域,然后直接清除原来区域中所有的对象。
分代算法:将整个空间分为几个不同的年代区,主要是新生代和老年代。新生代使用复制算法,老年代使用标记整理算法。

十二、说一下 JVM 有哪些垃圾回收器?

Serial:最早的单线程串行垃圾回收器;
Serial Old:serial的老年代板,同样也是单线程的,可以作为CMS垃圾回收器的备选预案;
ParNew:是Serial的多线程版本;
Parallel:和ParNew垃圾回收器一样是多线程的,只不过Parallel是以吞吐量为优先的,可以牺牲等待时间换取系统的吞吐量;
Parallel Old: Paraller的老年代版本;
CMS:一种以获得最短停顿时间为目标的收集器,非常适用于B/S系统;
G1:一种兼顾了吞吐量和停顿时间的GC实现,是JDK9以后的默认实现;

十三、详细介绍一下 CMS 垃圾回收器?

CMS垃圾回收器是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。它主要使用的是标记清楚算法,这种算法容易出现大量的内存碎片,所以当内存碎片过多不满足程序运行要求的时候,系统将会出现Concurrent Mode Failure,临时CMS会调用Serial Old垃圾回收器进行清除,这个时候性能将会被降低。

十四、新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

新生代:Serial、Parallel、ParNew
老年代:Serial Old、Parallel Old、CMS
老年代的垃圾回收器使用的是标记整理算法,而新生代的垃圾回收器使用的是复制算法。

十五、简述分代垃圾回收器是怎么工作的?

先说一下堆是怎么划分老年代和新生代的吧,堆空间中新生代主要占1/3的大小,老年代占2/3。然后新生代中又分为了Eden、From survivor、to survivor,他们的空间占比分别为8:1:1。对象主要从新生代的Eden区生成,然后堆积到一定的数量之后会触发minor gc,将一部分垃圾对象清除,剩下的一部分有用对象放入From survivor区域,之后等到Eden区和From survivor区中任意的一个区域满了就会再次触发minor gc将有用对象放入To survivor区域,这个时候To survivor区域会转变为From survivor区域,而且此次的留存对象的年龄会加一,然后再次重复上述工作,直到年龄到达了15就会将有用的对象放入老年代,然后一直这样操作直到老年代被存满数据触发Full GC

十六、说一下 JVM 调优的工具?

JVM调优工具主要放在JDK的bin目录下面,常用的调优工具有两种
jconsole:用于对JVM中的内存、线程和类等进行监控
jvisualvm:JDK自带的全能分析工具,可以分析内存快照、线程快照、程序死锁、监控内存的变化和GC的变化等

十七、常用的 JVM 调优的参数都有哪些?

Xms2g: 设置堆内存的初始化值为2g;
Xmx2g:设置堆内存的最大值为2g;
Xss512k: 设置栈的内存大小为512k;
-XX:NewRatio=4:设置年轻代和老年代的比为1:4
-XX:SurvivorRatio=8:设置Eden和Survivor的比例是8:2
-XX:+UseParNewGC:指定使用ParNew + Serial Old垃圾回收器组合
-XX:+UseParallelOldGC:指定使用ParNew + ParNewOld 垃圾回收组合
-XX:+UseConcMarkSweepGC:指定使用CMS + SerialOld 垃圾回收器组合
-XX:+PrintGC:开启打印GC信息
-XX:+PrintGCDetail:开启打印GC详情

十八、说一下G1收集器的优化建议?

核心在于调节-XX:MaxGCPauseMills这个参数的值,保证它的年轻代GC别太频繁的同时,还得考虑每次GC过后存活的对象有多少,避免存活对象太多快速进入老年代,频繁触发MixedGC。

十九、full gc比minor gc次数还多的原因有哪些?

1、元空间的容量不足,导致频繁扩容,然后频繁full gc;
2、代码中使用了System.gc();的方法,该方法执行一次就会出现一次full gc,所以一般启动应用程序时,都应该在启动指令中加上-XX:+DisableExplicitGC指令来使上述调用full GC的方法无效;
3、由于老年代空间分配担保机制导致的,这种情况一般是一次minor gc对应两次full gc;

二十、什么是内存泄漏?

内存泄漏一般是在做JVM级缓存的时候,没有及时清理缓存中已经过时的数据所导致。解决方法也很简单,使用一些自带淘汰算法的框架来作为JVM级的缓存。

二十一、JVM中的安全点(区域)?

每次GC的时候都不会立刻进行GC的,因为有些操作是要保证原子性的,不能拆开来去执行,所以这种时候就需要有一个安全点判断当前位置是可以进行GC而不会影响原子操作的。安全点一般都是在一个方法的执行前后都会有设置。安全区域是针对那些处于休眠状态的线程来划出的一个安全区域,因为线程处于休眠状态,无法触发安全点的检测机制,所以在线程休眠的那一块区域,用户线程都可以直接挂起,让GC顺利执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java虚拟机(JVM)是负责运行Java应用程序的软件。下面是一些常见的Java JVM面试题及其答案: 1. 元空间会产生内存溢出吗?在什么情况下会产生内存溢出? 元空间不会产生内存溢出。元空间是JVM中用于存储类和元数据的区域,它的大小不受JVM堆内存限制。当元空间中的类和元数据数量超过了元空间的限制,会抛出OutOfMemoryError错误。 2. JVM内存模型中的哪些区域是线程私有的? JVM内存模型中,线程私有的区域包括程序计数器、虚拟机栈和本地方法栈。 3. 什么是OOM异常?它通常在什么情况下发生? OOM(Out of Memory)异常表示内存溢出。当JVM无法为应用程序分配足够的内存时,就会抛出OOM异常。常见的内存溢出情况包括堆内存不足、栈溢出和元空间溢出。 4. JVM的垃圾回收算法有哪些? JVM的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法。 5. 什么是垃圾回收器?JVM中有哪些常见的垃圾回收器? 垃圾回收器是负责执行垃圾回收的组件。在JVM中,常见的垃圾回收器包括Serial、Parallel、CMS和G1等。 6. JVM调优的方法有哪些? JVM调优的方法包括调整堆内存大小、选择合适的垃圾回收器、优化代码以减少内存占用、减少对象的创建和销毁等。 7. 什么是类加载器?有哪些不同类型的类加载器? 类加载器负责将类字节码加载到JVM中,并在运行时动态加载类。在Java中,常见的类加载器包括启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。 8. JVM的性能调优工具有哪些? JVM的性能调优工具包括jstat、jmap、jstack、VisualVM等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缘丶沐逸尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值