什么是GC root?

虚拟机栈(栈帧中的局部变量区)中引用的对象。
方法区中类静态属性引用的对象
静态常量引用的对象
本地方法栈中引用的对象

查看JVM默认值

jvm 参数类型: 标配参数、X参数、XX参数
XX参数又分为boolean类型、kv键值对类型的参数
先获取进程编号 jps -l
查看进程某个属性值
jinfo -flag boolean类型属性 线程编号

  1. jinfo -flag PrintGCDetails 5614

kv类型

  1. # 设置某个属性值
  2. # 启动时添加参数
  3. -XX:MetaspaceSize=1024m
  4. 查看
  5. jinfo -flag MetaspaceSize 线程编号

查看所有参数配置

  1. jinfo -flags 线程编号
  1. D:\git\finger_music>jinfo -flags 5612
  2. Attaching to process ID 5612, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.212-b10
  6. Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=400556032 -XX:+ManagementSer
  7. ver -XX:MaxHeapSize=6406799360 -XX:MaxNewSize=2135425024 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=133169152 -XX:OldSize=267386880 -XX:+PrintGCDetails -XX:T
  8. ieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UsePa
  9. rallelGC
  10. Command line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:8682,suspend=y,server=n -XX:+PrintGCDetails -XX:TieredStopAtLevel=1 -Xverify:none -Dspr
  11. ing.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabl
  12. ed=true -javaagent:C:\Users\85109\.IntelliJIdea2019.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8

查看jvm根据系统自配置信息

  1. java -XX:+PrintFlagsInitial

image.png

JVM调优

-Xms 设置初始堆内存大小,默认为物理内存的1/64
-Xmx 最大分配堆内存,默认为物理内存的1/4
-Xss 设置单个线程栈的大小,一般默认为512-1024k
-Xmn 设置年轻代大小
-XX:MetaspaceSize 设置元空间大小,仅受本地物理内存限制。初始值为21M
-XX:+PrintGCDetails 设置GC细节打印
-XX:SurvivorRatio 设置新生代中eden和S0/S1空间比例,默认是-XX:SurvivorRatio8
-XX:NewRatio 设置新生代与老年代的堆结构内存占比。默认 -XX:NewRatio=2
-XX:MaxTenuringThreshold 设置进入年老代的年龄设置 默认值 15

image.png

image.png

强引用、软引用、弱引用、虚引用是什么?

强引用:我们正常使用的对象引用一般都是强引用,对此对象JVM垃圾回收时不会处理。就算出现OOM也不会回收,所以也是产生内存泄露的主要原因之一。
软引用(SoftReference):当内存够用时不会回收、若是不够用了则就会回收。
使用场景:做缓存设置是可以使用软引用
弱引用(WeakReference):只要发生GC,一定回收
使用:WeakHashMap
虚引用(PhantomReference):随时都可能被回收,如果一个对象持有虚引用,那么就和没有任何引用一样,任何 时候都可能被GC回收。虚引用必须和引用队列Renference联合使用。
主要作用是跟踪对象被垃圾回收的状态。仅仅提供一种确保对象被finalize以后,做一些操作的机制。PhantomReference的get方法总是返回null,因此无法访问对应的对象。其意义在于说明一个对象已经进入到finalization阶段,可以被GC回收,用来实现比finalization更灵活的回收操作。
也就是说,虚引用的唯一目的就是在这个对象被收集器回收的时候收到一个系统通知或后续添加进一步的处理,类似于spring 的AOP后置处理器。
Java允许使用finalize() 方法在垃圾回收器将对象从内存中清除之前做一下清理工作。

OOM异常:

image.png

GC垃圾回收算法和垃圾收集器的关系,分别是什么?

GC垃圾回收器是垃圾回收算法的落地实现。
回收算法有引用计数法、复制算法、标记清除算法和标记整理算法。
分别有串行回收、并行回收、并发回收和G1回收器。

如何查看当前回收器,一共有多少种类型,

查看命令

  1. -XX:+PrintCommandLineFlags -version

UseSerialGC、UserParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC 、UserG1GC

各种垃圾回收器在年轻代和年老代的搭配使用
image.png
image.png
image.png

G1(garbage-frist):将年老代和年轻代整合分为一块一块的内存region,大小为1-32M(必须是2的次方),最多有2048个块(意味G1垃圾回收器最大处理64G的内存)。

spring boot 包配置参数命令

java -server 调优参数 -jar 可执行jar包

常用排查故障命令

top、wmstat、free、df、iostat、ifstat
vmstat -n 2 3 每2s采样三次cpu使用
mpstat -P ALL 2 每2s采样cpu使用
pidstat -p 进程号 -r 采样间隔秒数 针对进程进行查看内存信息
iostat -xdk 采样间隔秒数 采样次数 查看io信息
pidstat -p 进程号 -d 采样间隔秒数 针对进程进行查看IO信息
ifstat 1 查看网络IO信息

cpu占用过高,谈谈分析思路和定位

查找cpu占用过高的程序,
ps -ef 或者jps查看是怎样的一个后台程序。
定位到具体线程或者代码。
ps -mp 进程 -o THREAD,tid,time 查看具体线程
-m 显示所有的线程
-p pid 进程使用的时间
-o 该参数后是用户自定义格式

将线程号转为16进制小写
jstack 进程ID | grep tid(线程号的16进制小写) -A60(前60行)