当前位置:网站首页>几道高频的JVM面试题
几道高频的JVM面试题
2022-07-06 09:19:00 【Java烟雨】
前言
大家好。我整理了几道高频的JVM面试题,小伙伴们加油呀!
JVM内存为什么要分成新生代,老年代
新生代中为什么要分为Eden和Survivor
JVM中一次完整的GC流程是怎样的
CMS收集器和G1收集器的区别
JVM 调优
CPU飙升如何排查
1. JVM内存为什么要分成新生代,老年代?
1.1 JVM共享内存划分
共享内存区 = 持久代 + 堆(jdk1.8及以上jvm废弃了持久代)
持久代 = 方法区 + 其他
Java堆 = 老年代 + 新生代
新生代 = Eden + S0 + S1
1.2 为什么分年老代和新生代
新生代:主要存放新创建的对象,内存大小一般会比较小,垃圾回收会比较频繁。
老年代(Tenured Gen):主要存放JVM认为生命周期比较长的对象(经过几次的Young GC的垃圾回收后仍然存在),或者大对象,垃圾回收也相对没有那么频繁。
为什么划分老年代和新生代,主要 对象大小不一样,对象生命周期不一样。划分后,提供垃圾回收效率,节省资源,提升对象利用率 等等。
2. 新生代为何划分Eden和Survivor?为什么设置两个Survivor
如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。
Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)
3. JVM中一次完整的GC流程是怎样的
Java堆划分为老年代和新生代
新生代 划分为Eden和两个Survivor(S0、S1)
当 Eden区的空间满了, Java虚拟机会触发一次Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区。
大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态;
如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态。
老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代。
Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上。
4. CMS收集器和G1收集器的区别
CMS收集器是老年代的收集器,一般配合新生代的Serial和ParNew收集器一起使用;G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
CMS收集器是一种以获取 最短回收停顿时间 为目标的收集器, G1收集器 可预测垃圾回收的停顿时间 。
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片;而G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
CMS和G1的回收过程不一样,垃圾回收的过程不一样。CMS是 初始标记、并发标记、重新标记、并发清理 ;G1是初始标记、并发标记、最终标记、筛选回收。
5. JVM 调优
JVM调优其实就是通过调节JVM参数,即对垃圾收集器和内存分配的调优,以达到更高的吞吐和性能。JVM调优主要调节以下参数
堆栈内存相关
-Xms 设置初始堆的大小
-Xmx 设置最大堆的大小
-Xmn 设置年轻代大小,相当于同时配置-XX:NewSize和-XX:MaxNewSize为一样的值
-Xss 每个线程的堆栈大小
-XX:NewSize 设置年轻代大小(for 1.3/1.4)
-XX:MaxNewSize 年轻代最大值(for 1.3/1.4)
-XX:NewRatio 年轻代与年老代的比值(除去持久代)
-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 -Hp pid 获取本进程中所有线程的CPU耗时性能
printf %x cpu最高的线程(即转为16进制)
jstack 命令查看当前java进程的堆栈状态 | grep 那个16进制
或者 jstack -l > /tmp/output.txt 把堆栈信息打到一个txt文件。
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
咱们下期见!答案获取方式:已赞 已评 已关~
学习更多知识与技巧,关注与私信博主(03)
边栏推荐
- Novatel board oem617d configuration step record
- [算法] 劍指offer2 golang 面試題2:二進制加法
- NovAtel 板卡OEM617D配置步骤记录
- Problems and solutions of robust estimation in rtklib single point location spp
- [dry goods] cycle slip detection of suggestions to improve the fixed rate of RTK ambiguity
- Rt-ppp test using rtknavi
- 音乐播放(Toggle && PlayerPrefs)
- Code example of MATLAB reading GNSS observation value o file
- FairyGUI增益BUFF数值改变的显示
- KF UD分解之伪代码实现进阶篇【2】
猜你喜欢
RTKLIB: demo5 b34f.1 vs b33
Prove the time complexity of heap sorting
编辑距离(多源BFS)
121道分布式面试题和答案
The master of double non planning left the real estate company and became a programmer with an annual salary of 25W. There are too many life choices at the age of 25
[algorithm] sword finger offer2 golang interview question 1: integer division
[algorithm] sword finger offer2 golang interview question 13: sum of numbers of two-dimensional submatrix
There is no red exclamation mark after SVN update
[算法] 剑指offer2 golang 面试题6:排序数组中的两个数字之和
Fairygui joystick
随机推荐
[algorithm] sword finger offer2 golang interview question 2: binary addition
FairyGUI循環列錶
Pride-pppar source code analysis
Mixed use of fairygui button dynamics
InnoDB dirty page refresh mechanism checkpoint in MySQL
[算法] 剑指offer2 golang 面试题9:乘积小于k的子数组
【无标题】
Introduction to the daily practice column of the Blue Bridge Cup
Meanings and differences of PV, UV, IP, VV, CV
[algorithm] sword finger offer2 golang interview question 12: the sum of the left and right sub arrays is equal
FairyGUI复选框与进度条的组合使用
The port is occupied because the service is not shut down normally
wsl常用命令
Sharing ideas of on-chip transplantation based on rtklib source code
FairyGUI增益BUFF数值改变的显示
[algorithm] sword finger offer2 golang interview question 5: maximum product of word length
GNSS positioning accuracy index calculation
第一人称视角的角色移动
Fabrication of fairygui simple Backpack
Employment of cashier [differential constraint]