JVM垃圾回收时如何确定垃圾?
什么是垃圾
简单的说就是内存中已经不再被使用到的空间就是垃圾。
要进行垃圾回收,如何判断一个对象是否可以被回收?
引用计数法
枚举根节点做可达性分析(根搜索路径)
案例:
Java中可以作为GCRoots的对象:
- 虚拟机栈 (栈帧中本地变量)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native)引用的对象
如何盘点查看JVM默认值
JVM的参数类型
标配参数
- -version
- -help
- java -showversion
X参数
- -Xint:解释执行
- -Xcomp:第一次使用就编译成本地代码
- -Xmixed:混合模式
XX参数
Boolean类型
公式:-XX:+或者-某个属性值
是否打印GC回收细节:-XX:+PrintGCDetails
是否使用串行垃圾回收器:-XX:+PrintCommandLineFlags
KV设值类型
公式:-XX:属性key=属性值value
案例:
-XX:MetaspaceSize=128m
-XX:MaxTernuringThreshold
其它
盘点家底查看JVM默认值
-XX:+PrintFlagsInital
查看初始默认值。
公式:
- java -XX:+PrintFlagsInital version
- java -XX:+PrintFlagsInital
案例:
-XX:+PrintFlagsFinal
PrintFlagsFinal举例,运行java的同时打印参数
-XX:+PrintCommandLineFlags
查看默认垃圾收集器。
工作用过的JVM常用基本配置参数
基础知识复习
常用参数
典型设置案例:
-Xms128m -Xmx4096 -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
强、弱、软、虚引用分别是什么?
整体架构
强引用(默认支持模式)
案例:
软引用
案例:
弱引用
案例:
软引用与弱引用适用场景:
你知道弱引用,能谈谈WeakHashMap吗
虚引用
GCRoots和四大引用总结
谈谈你对OMM的认识
java.lang.StackOverFlowExceptioin
java.lang.OutOfMemoryException:Java heap space
java.lang.OutOfMemoryException:GC overhead limit exceeded
java.lang.OutOfMemoryException:Direct buffer memory
java.lang.OutOfMemoryException:unable to create new native thread
服务器级别参数调优:
java.lang.OutOfMemoryException:Metaspace
Java以后的JVM:
案例:
GC回收算法与垃圾回收器的关系?
GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现。
因为目前为止还没有完美的收集器出现,更加没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集
4种主要的垃圾收集器
生产上你是如何配置垃圾收集器的?
怎么查看默认垃圾回收器是哪个
java -XX:+PrintCommandLineFlags -version
默认垃圾回收器有哪些?
- UseSerialGC
- UseParalelGC
- UseConcMarkSweepGC
- UseParNewGC
- UseParallelOldGC
- UseG1GC
垃圾收集器
参数预先说明
Server/Client模式分别是什么意思
新生代
串行GC(Serial)/(Serial Copying)
并行GC(ParNew)
并行回收GC(Parallel)/(Parallel Scavenge)
老年代
串行GC。
并行GC(Parallel Old)/(Parallel MSC)
并发标记清除GC(CMS)
4个步骤:
- 初始化标记(CMS init Mark)
- 并发标记(CMR concurrent mark)和用户线程一起
- 重新标记
- 并发清除
优缺点:
- 优点:并发收集,低停顿
- 缺点:并发执行对CPU压力大
- 缺点:采用标记清除算法会导致大量碎片
案例
1 | /** |
垃圾收集器配置代码总结
G1垃圾收集器
以前垃圾回收器的特点
- 年轻代和老年代是各自独立连续的内存块
- 年轻代收集使用单eden+S0+S1进行复制算法
- 老年代收集必须扫描整个老年代区域
- 都是以尽可能少而快地执行GC为设计原则
G1是什么
特点:
底层原理
Region区域化垃圾收集器
回收步骤
4步过程
案例
1 | /** |
常用配置参数
开发人员仅仅需要声明以下参数即可:
三步归纳:开始G1+设置最大内存+设置最大停顿时间
-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=n:最大GC停顿时间单位毫秒,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间
和CMS相比的优势
- G1不会产生内存碎片
- 是可以精确控制停顿。该收集器是把整个堆(新生代、老年代)划分多个固定大小的区域,每次根据允许停顿的时间去收集垃圾最多的区域。
生产环境服务器变慢,诊断思路和性能评估谈谈?
整机:top
update,系统命令的精简版。
CPU:vmstat
查看CPU(包含不限于)
查看额外
内存:free
应用程序可用内存数。
查看额外
pidstat -p 进程号 -r 采样间隔秒数
硬盘:df
查看磁盘剩余空间。
磁盘IO:iostat
磁盘IO性能评估
查看额外
pidstat -p 进程号 -r 采样间隔秒数
网络IO:ifstat
默认本地没有,下载ifstat
查看网络IO
假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位
先用top命令找出CPU占比最高的
ps -ef或者jps进一步定位进程
定位到具体线程或代码
ps -mp 进程 -o THREAD,tid,time
- -m 显示所有的线程
- -p pid 进程使用cpu的时间
- -o 该参数后是用户自定义格式
将需要的线程ID转换为16进制格式(英文小写格式)
printf “%x\n” 有问题的线程ID
jstatck 进程ID | grep tid(16进制线程ID小写英文)-A60