1.jvm垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots
引用计数法--无法解决循环引用的问题
枚举根节点做可达性分析(根搜索路径):java中可以作为gc roots的对象 --
1. 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
2.方法区中的类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中Native方法引用的对象
2.你说你做过jvm调优和参数配置,请问如何盘点查看jvm系统默认值?
1.jvm的参数类型:
标配参数:-version -help
x参数(了解):-Xint 解释执行 -Xcomp 第一次使用就编译 -Xmixed 混合模式
xx参数(重点):
Boolean类型:
公式:-XX:+或-某个属性值 +表示开启 -表示关闭
2.如何查看java程序运行时是否有是否打印GC收集细节这个参数:
jps 查看进程编号
jinfo 查看某个属性值 --公式:jinfo -flag 配置项 进程编号 或者 flags查看全部
KV设值类型:例如:
-XX:MaxTenuringThreshold=15
-XX MetaspaceSize=128m
3.jinfo举例,如何查看当前运行程序的配置
题外话(坑题):
-Xms和-Xmx 这个你如何解释?
其实就是别名:等价于-XX:InitialHeapSize和-XX:MaxHeapSize
查看参数盘点家底:
第一种:jps jinfo -flag
第二种:java -XX:+PrintFlagsInitial 查看初始化参数
java -XX:+PrintFlagsFinal 主要查看修改更新
打印出来的 =是初始的 :=是修改过的
PrintFlagsFinal 举例,运行java命令的同时打印出参数:
PrintCommandLineFlags:
3.你平时工作中用过的jvm常用基本配置参数有哪些?
初始堆内存默认为是内存的1/64
最大堆内存大小默认为是内存的1/4
常用参数:
-Xss :设置单个线程栈的大小 ,一般默认为512k-1024k ,等价于:-XX:ThreadStackSize
栈管运行,堆管存储
默认值一般和平台有关:
-Xmn :设置年轻代大小 --一般不需要改
-XX:MetaspaceSize :设置元空间大小
典型设置案例:
-XX:+PrintGCDetails : 输出详细GC收集日志信息
GC:
FullGC:
规律:
-XX:SurvivorRatio:
-XX:NewRatio:
--XX:MaxTenuringThreshold:
4.强引用、软引用、弱引用、虚引用分别是什么?
组织架构图:java.lang.ref包
强引用:oom了都不收,死都不收
软引用:内存够用就保留,不够就回收
弱引用:只要有gc就回收
虚引用: 形同虚设的引用,虚引用必须和引用队列联合使用,主要用来做回收对象的监控
引用队列:ReferenceQueue--gc的时候会放入队列
软引用的适用场景:
你知道弱引用的话,能谈谈WeakHashMap吗
可以回收的HashMap
GCRoots和四大引用小总结:
5.请谈谈你对OOM的认识
java.lang.StackOverflowError : 栈满了 例如 递归程序 深度的方法调用
java.lang.OutOfMemoryError: java heap space 堆内存不够了 对象太多了
java.lang.OutOfMemoryError: GC overHead limit exceeded
java.lang.OutOfMemoryError: Direct buffer memory
java.lang.OutOfMemoryError: unable to create new native thread 不能再创建新的线程了
java.lang.OutOfMemoryError: Metaspace 元空间被撑满
元空间存了哪些东西?
6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈
GC算法(引用计数--复zi--标记清除--标记整理)是内存回收的方法论,垃圾收集器就是算法实现落地。
垃圾收集器:
Serial 串行 为单线程环境设计 ,开启一个垃圾收集线程收集垃圾,会暂停用户线程
Parallel 并行 开启多个垃圾收集线程,也会暂停用户线程
串行和并行都会导致STW问题 :暂停整个应用 可能时间很长
CMS 并发 用户线程和垃圾收集线程同时执行,适用于对响应时间有要求的场景
G1 比较特殊 :G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行回收
7.怎么查看服务器默认的垃圾收集器是哪个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?
java -XX:+PrintCommandLIneFlags -version
1.默认的垃圾收集器有哪些?
UseSerialGC UseParallelGC UseConcMarkSweepGC UseParNewGC useParallelOldGC UseG1GC
2.新生代和老年代GC适合用哪种垃圾收集器?
3.如何选择垃圾收集器?
4.Server/Client模式分别是什么意思?
8.G1垃圾收集器
1.特点:
启动时可以通过-XX:G1HeapRegionSize=n 可以指定分区大小(1-32mb,且必须是2的幂),默认将堆分成2048个分区
2.g1和CMS相比的优势
1.G1不会产生内存碎片
2.可以精确控制停顿
9.jvmgc+springboot实际工作中,如何结合springboot进行调优?
步骤:
1.idea开发完微服务工程
2.maven进行clean package
3.要求微服务启动的时候,同时配置我们的JVM/GC的调优参数
3.1内
3.2外 ---例如