Day489&490&491.尚硅谷之高频重点面试题③ -面经
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day489&490&491.尚硅谷之高频重点面试题③ -面经相关的知识,希望对你有一定的参考价值。
尚硅谷之高频重点面试题③
一、快速回顾
1、JVM内存结构
- 类的加载器是什么?
- 双亲委派机制是什么?
- Java沙箱安全机制是什么?
- 堆的由什么组成?
- 新生代
- 幸存者1
- 幸存者2
- 伊甸区
- 养老区
- 永久代(7)、元空间(8)
- 新生代
2、GC作用域
- 哪些部位是JVM线程私有的?
- 程序计数器
- Java栈
- 本地方法栈
- JVM线程共有?
- 堆
- 方法区
3、常见垃圾回收算法
-
引用计数算法
有对象引用+1,没对象引用-1。存在循环引用问题
-
标记清除
- 先标记出要回收的对象,后清除
- 存在内存碎片
- 相比复制算法,节约了内存空间
-
标记压缩
- 先标记出要回收的对象,后清除,再压缩整理内存碎片
- 没有内存碎片
- 有移动对象的成本
- 相比另外的算法,更耗时
-
复制算法
- 堆空间年轻代的幸存者1/2区在用,谁空谁是to
- 没有内存碎片
- 需要2倍的内存空间
二、JVM垃圾回收的时候如何确定垃圾?是否知道什么是GCRoots?
-
是什么垃圾?
内存中已经不再使用到的空间就是垃圾
-
如何判断一个对象是否可以被回收?判断方法有哪些?
-
引用计数法
-
可达性分析法
被GCRoots直接或间接引用可达就不会被回收
-
-
哪些对象可以作为GCRoots?
两个栈,两个方法区
三、如何盘点查看JVM系统默认值?
1、参数类型
-
标配参数
- -version
- -help
- java -showversion
-
X参数(了解)
- -Xint 解释执行
- -Xcomp 第一次使用就编译成本地代码
- -Xmixed 混合模式
-
XX参数
-
Boolean类型
-XX:+ -XX:- # +表示开启,-表示关闭 # 举例 -XX:+PrintGCDetails
-
KV键值对类型
# 举例 -XX:MetaspaceSize=1024m
-
2、怎么查看一个正在运行的java进程的jvm参数?
jinfo -flag <具体参数名> <java进程号>
jps
jinfo -flags <java进程号>
3、如何查看参数盘点家底
-XX:+PrintFlagsInitial #初始值
-XX:+PrintFlagsFinal #最终值
四、平时常用的JVM常用基本配置参数有哪些?
常用参数典型案例
-Xms128m -Xmx4096m -Xss1024kb -XX:MetaspaceSize=512m -XX:PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
-
-Xmx
- 最大堆空间内存大小,默认物理内存的1/4
- 等价:-XX:InitialHeapSize
-
-Xms
- 初始堆空间内存大小,默认物理内存的1/64
- 等价:-XX:MaxHeapSize
-
-Xss
- 设置单线程栈的大小,默认512k-1024k
- 等价:-XX:ThreadStackSize
-
-Xmn
- 设置堆空间新生代内存大小(一般不动)
-
-XX:MetaspaceSize
- 设置元空间大小
-
-XX:PrintGCDetails
-
GC收集日志
-
-
-XX:SurvivorRatio(一般不动)
- 设置伊甸园区比例占用,默认为8,8:1:1
-
-XX:NewRatio
- 设置新生代与老年代比例占比,默认为2,1:2
-
-XX:MaxTenuringThreshold
- 设置垃圾回收年龄阈值,默认为15,要求设置范围在:0-15
五、强/软/弱/虚引用是什么?你能说说吗?
-
强引用(默认支持)
- 就算出现OOM也不会对该对象进行GC垃圾回收,
死都不收
- 就算出现OOM也不会对该对象进行GC垃圾回收,
-
软引用
不够就收
-
弱引用
GC就收
-
虚引用
对象回收的监控
虚引用对象被回收之前,会被放置在对应关联的引用队列中,可以从引用队列取出,做一些想做的操作(死之前)
小总结:
强引用
:在垃圾回收之外,永不回收
软引用
:内存不足就回收
弱引用
:GC就回收
虚引用
:GC前/GC后都无法获取到对象,形如虚设,回收前会被放入引用队列
六、请你谈谈对OOM的认识
七、GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈?
-
主要的垃圾回收器
Serial串行回收
- 只有单线程去做GC,并且在执行GC时,其他所有用户线程将不能工作
Parallel并行回收
- 多线程去做GC,工作时会暂停所有用户线程
CMS并发标记清除
- 用户线程和GC线程可并行或交替执行,不需要用户线程停顿等待
G1分代回收
- 将堆内存分割成一块一块的区域,并并发的对其垃圾回收
-
GC算法是方法论,垃圾回收器是落地的实现
-
现在完美的垃圾回收器,对应的场景需要使用对应适合的垃圾回收器
八、如何查看服务器默认的垃圾回收器?生成上如何垃圾回收器?谈谈你对垃圾回收器的理解?
- 查看默认垃圾回收器
-XX:+PrintCommandLineFlags -version
- 设置垃圾回收器
-XX:+UseSerialGC
-XX:+UserXXX
- 新生代&老年代对应使用的垃圾回收器
-
垃圾回收器
https://achang.blog.csdn.net/article/details/119155126
-
Serial回收器【串行回收】
单线程
环境,简单高效,不需要线程切换开销
-
ParNew回收器【并行回收】
- 多线程版本的Serial回收器,
多线程环境情况下性能更优
- 多线程版本的Serial回收器,
-
Parallel回收器【吞吐量优先】
吞吐量优先
,多线程情况下性能较好,与用户交互较少,高吞吐量
-
CMS回收器【低延迟】
-
低延迟
(低STW时间),并发收集 -
执行过程:
-
-
G1回收器【区域化分代式】
- 并发与并行
- 分代收集
- 空间整合(进行复制算法会对内存空间的整合)
- 避免了全内存扫描,变成了区域Region扫描
可预测停顿时间模型
(近可能靠近设置的停顿时间值)
-
-
如何选择合适的垃圾收集器
- G1和CMS垃圾回收器的区别
- 相同点
- 都可并发的垃圾回收
- 不同点
- G1不存在内存碎片
- G1进行小范围的垃圾回收
- G1可以指定预期停顿时间
- 相同点
九、SpringBoot结合JVM生产优化调参
java -server jvm各种参数 -jar xxx.jar/war
java -server -Xms1024m -Xmx1024m -XX:+UseG1GC -jar achang.jar
以上是关于Day489&490&491.尚硅谷之高频重点面试题③ -面经的主要内容,如果未能解决你的问题,请参考以下文章
CodeforcesCodeforces Round #491 (Div. 2) (Contest 991)
TopCoder 最佳选择算法来自 SRM 489 DIV 2 (500 pt)