堆区:{Young[(s0+s1)+Eden] + Old}
非堆区:{Metaspace[CCS + CodeCache]}
垃圾回收算法枚举根节点,做可达性分析
根节点:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等等
回收算法:
1.标记清除:分为“标记”和“清除”两个阶段,首先标记出所有需要回收等对象,在完成标记后统一回收。
缺点:效率不高。会产生碎片,碎片太多会导致提前GC。
2.复制
缺点:空间利用率低。
3.标记整理
缺点:整理内存比较耗时。
JVM采用分代垃圾回收
Young区采用复制法
Old采用标记清除或标记整理
垃圾收集器串行收集器Serial:Serial、Serial Old
并行收集器Parallel:Parallel Scavenge、Parallel Old,吞吐量优先
并发收集器 Concurrent: CMS、G1,响应时间优先
JVM的参数类型 标准参数-help
-server -client
-version -showversion
-cp -classpath
2.X参数(非标准化参数)
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式,JVM自己来决定是否编译成本地代码
3.XX参数(非标准化参数、相对不稳定、主要用于JVM调优和Debug)
非Boolean类型
格式:-XX:<name>=<value> 表示name属性的值是value
例:-XX:MaxGCPauseMillis=500
XX:GCTimeRatio=19
Boolean类型
格式:-XX:[+-]<name> 表示启用或禁用name属性
例:-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
以下特殊,不是X参数,而是XX参数
-Xmx = -XX:InitialHeapSize
-Xms = -XX:MaxHeapSize
运行时JVM参数查看-XX:+PrintFlagslnitial 查看初始值
-XX:+PrintFlagsFinal 查看最终值
-XX:+UnlockExperimentalVMOptions 解锁实验参数
-XX:+UnlockDiagnosticVMOptions 解锁诊断参数
-XX:+PrintCommandLineFlags 打印命令行参数
jinfo命令查看最大内存
jinfo -flag MaxHeapSize [进程号]
查看垃圾回收器
jinfo -flag UseConcMarkSweepGC [进程号]
jinfo -flag UseG1GC [进程号]
jinfo -flag UseParallelGC [进程号]
jstat查看虚拟机统计信息类加载信息
例: jstat -class [进程号] [毫秒] [输出次数]
垃圾回收信息
例:jstat -gc [进程号] [毫秒] [输出次数]
JIT编译信息
例:jstat -compiler [进程号]
jmap+MAT内存溢出堆内存溢出: 对象
-Xmx32M -Xms32M
非堆内存溢出: 类
-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
解决思路:
分析内存映像文件(内存泄漏或者内存分配不足)
自动导出内存映像文件:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
手动导出:
jmap -dump:format=b,file=heap.hprof [进程号]
MAT(内存映像文件分析工具,网上搜索下载,将生成的.hprof文件导入)
jstack死循环与死锁jstack [进程号] > [进程号].txt (重定向到txt中,方便分析