当前位置: 首页 > 后端技术 > Java

看了最新大厂面试,这6道JVM面试题都被问到了

时间:2023-04-01 20:30:27 Java

看了各大厂商最新的面试,这6道JVM面试题都被问到了。JVM相关面试题整理分享。之前更新过MySQL和Spring,有需要的同学也可以看看。希望对准备秋招的你有所帮助!JVM面试题:JVM内存为什么要分新生代,老年代为什么要分Eden和Survivor?JVM中一个完整的GC流程是怎样的?CMS收集器和G1收集器的区别。我整理的所有面试题都是免费分享的。只求大家点赞,关注,转发。这些文件放在文章的末尾。需要的同学可自行领取。1.1JVM共享内存划分共享内存区=持久代+堆(jdk1.8及以上jvm丢弃了持久代)持久代=方法区+其他Java堆=老年代+新生代新生代=Eden+S0+S11.2为什么要分老一代和新生代呢?新生代主要存放新创建的对象,内存大小一般较小,垃圾回收也比较频繁。老年代(TenuredGen):主要存放JVM认为生命周期比较长的对象(经过几次YoungGC垃圾回收后仍然存在),或者大对象,垃圾回收相对不频繁。为什么要分老年代和新生代,主要对象大小不一样,对象生命周期不一样。划分后,提供垃圾回收效率,节省资源,提高对象利用率等等。2、为什么新生代分为Eden和Survivor?为什么要设置两个Survivor?如果没有Survivor,每次在Eden区进行MinorGC,都会将存活的对象送往老年代。老年代很快被填满,触发MajorGC。oldgeneration的内存空间比newgeneration大很多,FullGC比MinorGC耗时长很多,所以需要分成Eden和Survivor。Survivor的意义在于减少送往老年代的对象数量,从而减少FullGC的发生。Survivor预筛选保证只有在16次MinorGC后在新生代存活的对象才会被送到老年代。时代。设置两个Survivor区最大的好处就是解决碎片化问题。新创建的对象在伊甸园中。一次MinorGC后,Eden中存活的对象会被移动到第一个存活空间S0,Eden会被清空;当该区域再次满时,会再次触发MinorGC,将Eden和S0中存活的对象复制并发送到第二个幸存者空间S1(这个过程很重要,因为这个复制算法保证了S1来自S0和Eden两部分存活的对象占据连续的内存空间,避免了碎片)3.JVM中一个完整的GC过程是什么?Java堆分为老年代和新生代。新生代分为Eden和两个Survivor(S0,S1),当Eden区空间满时,Java虚拟机触发MinorGC收集新生代中的垃圾,存活的对象将转移到幸存者区。大对象(需要大量连续内存空间的Java对象,比如很长的字符串)直接进入old状态;如果对象出生在Eden,在第一次MinorGC后存活下来,并被Survivor收容,则age设置为1,每经过一次MinorGC,age就会+1。如果年龄超过一定限度(15岁),则晋升为老年。即长寿对象进入旧状态。老年代已满,无法容纳更多的对象。在MinorGC之后,通常会执行FullGC。FullGC清理整个内存堆——包括年轻代和老年代。MajorGC发生在老年代的GC中。老区的清理往往伴随着至少一次MinorGC,比MinorGC慢10倍以上。4、CMS收集器和G1收集器的区别。CMS收集器是老年代收集器,一般与新一代Serial和ParNew收集器配合使用;G1收集器的收集范围是新旧两代,不需要结合其他收集器使用;CMS收集器是以获取最短收集停顿时间为目标的收集器,G1收集器可以预测垃圾收集的停顿时间。CMS收集器采用“mark-clear”算法进行垃圾收集,容易产生内存碎片;而G1收集器使用“标记-排序”算法,进行空间整合,减少内存空间碎片。CMS和G1的回收过程不一样,垃圾回收的过程也不一样。CMS是initialmark,concurrentmark,remark,concurrentcleanup;G1为初始标记、并发标记、最终标记、筛选循环。5、JVM调优JVM调优实际上是调整JVM参数,即调优垃圾收集器和内存分配,以达到更高的吞吐量和性能。JVM调优主要调整以下参数栈内存相关-Xms设置初始堆的大小-Xmx设置最大堆的大小-Xmn设置新生代的大小,相当于配置-XX:NewSize和-XX:MaxNewSize同时为同一个值-Xss每个线程的栈大小-XX:NewSize设置新生代的大小(for1.3/1.4)-XX:MaxNewSize新生代的最大值(for1.3/1.4)-XX:NewRatio新生代与老年代的比例(不包括永久代)-XX:SurvivorRatioEden区与Survivor区的比例-XX:PretenureSizeThreshold当创建的对象超过指定大小时,对象直接分配给老年代。-XX:MaxTenuringThreshold设置Survivor中复制的对象的最大年龄阈值,当超过阈值时,转移到老年代垃圾收集器。-XX:+UseParallelGC:选择垃圾收集器为并行收集器。-XX:ParallelGCThreads=20:配置并行收集器的线程数-XX:+UseConcMarkSweepGC:设置老年代为并发收集。-XX:CMSFullGCsBeforeCompaction=5由于并发收集器没有对内存空间进行压缩和组织,运行一段时间后会产生“碎片”,降低运行效率。该值设置为在运行5次GC后压缩和整理内存空间。-XX:+UseCMSCompactAtFullCollection:开启老年代的压缩。可能会影响性能,但是可以消除与碎片相关的辅助信息-XX:+PrintGCDetails打印GC详情-XX:+HeapDumpOnOutOfMemoryError让JVM在内存溢出时自动生成内存快照,排错时使用-XX:+DisableExplicitGC禁止系统System.gc(),防止误手动触发FGC导致的问题。-XX:+PrintTLAB查看TLAB空间使用情况6.CPU飙升如何排查输入jps获取进程号。top-Hppid获取本进程所有线程的CPU耗时性能printf%xcpu最高的线程(即转为16进制)jstack命令查看当前java进程的栈状态|grep那个十六进制或者jstack-l>/tmp/output.txt打印堆栈信息到一个txt文件。我先写这篇文章是为了收集资料。整理了一些面试中的常见问题,后续会继续更新。需要PDF的朋友可以点赞这篇文章+关注【点此】领取