一.基础:
1)什么是java虚拟机、工作模式(2、区别)
2)基本结构(9)
a)方法区(永久区、元数据区):存放内容、参数(1)
-XX:MaxMetaspaceSize 1.8以后元数据区,默认不指定大小,最大可使用系统内存,超出溢出为OOM
b)java堆:特点、结构、参数(3+2+3)
-Xmx:堆空间最大值,空间不足抛出OOM,Out Of Memory
-Xms:堆初始值
-Xmn:堆中新生代大小,新生代的大小一般设置为堆空间的1/3到1/4
-XX:NewRatio 设置老年代和新时代的比例,老年代/新时代
-XX:SuvivorRatio 设置新eden空间和from/to空间的比例
-XX:HeapDumpOnOutOfMemoryError 内存溢出时,导出内存溢出整个堆信息
-XX:HeapDumpPath 指定导出文件位置,需要使用MAT工具打开
-XX:OnOutMemoryError=脚本路径 虚拟机运行发生OOM时执行一个脚本
c)直接内存:特点、参数(1)
-XX:MaxDirectMemorySize 最大直接内存,不设置,默认最大堆内存
d)java栈:特点,组成(栈帧、局部变量表、操作数、帧数据(组成)、槽位)、栈上分配(优缺点)、参数(1+2)
-Xss:线程最大Java栈空间 StackOverflowError
-XX:DoEscapeAnalysis 开启逃逸分析,只有在-Server模式下可用
-XX:+EliminateAllocations 开启标量替换,允许对象打散分配到栈上,默认开启
3)其他参数:
1.日志跟踪分析(回收堆8)
-XX:+PrintGC 打印垃圾回收日志,显示堆空间变化
-XX:+PringGCDetail 打印详细垃圾回收日志,显示堆空间变化
-XX:+PrintGCTimeStamps 增加输出距离启动发生回收的时间偏移量
-XX:+PrintHeapAtGC 打印全面的堆信息
-XX:+PrintGCApplicationConcurrentTime 打印应用程序执行时间
-XX:+PrintGCApplicationStoppedTime 打印回收造成的应用停顿时间
-XX:+PrintReferenceGC 打印跟踪系统内软、弱、虚引用和Finallize队列信息
-Xloggc:路径 指定打印日志文件路径
2.虚拟机日志跟踪分析(3)
-XX:+PrintVMOption 打印虚拟机接受到的命令参数
-XX:+PrintCommondLineFlags 打印传递给虚拟机的显式和隐式参数
-XX:+PrintFlagsFinal 打印所有的系统参数
3.类日志跟踪分析(4)
-verbose:class 跟踪类的加载和卸载
-XX:TraceClassLoading 跟踪类的加载
-XX:TraceClassUnloading 跟踪类卸载
-XX:+PrintClassHistogram 打印系统类的分布情况
二.垃圾回收
1)垃圾回收:概念、STW
2)垃圾回收算法:
a)引用计数法(Reference Counting):计数器引用加1,引用失效减1。
问题:无法处理循环引用;加减操作影响性能
b)标记清除法(Mark-Sweep):通过根节点标记所有可达对象,然后清除所有不可达对象;串行垃圾回收器,eden存活对象复制到未被使用的survivor空间
问题:空间碎片,不连续的内存空间影响性能
c)复制算法(Copying):内存分两块,回收时将存活对象复制到未使用内存空间
问题:内存折半
d)标记压缩法(Mark-Compact,标记清除压缩算法Mark-Sweep-Compact):在标记清除算法上增加存活对象压缩到内存一段,之后清除边界外空间;适合老年代
e)分代算法(Generational Collecting):将内存区间根据对象特点分成几块,每块使用不同回收算法,新生代用复制算法,老年代用标记清除法或标记压缩法
卡表:卡表中每个比特位用来表示老年代的某一区域中所有对象是否持有新生代对象的引用,新生代GC时扫描卡表减少时间
f)分区算法(Region):将堆空间划分成连续的不同小区间,每个小区间独立使用独立回收,一次回收可控制区间数量
3)引用和可触及强度:4种、特征
三.垃圾回收器:
1)串行SerialGC回收器:虚拟机工作在Client模式下的默认垃圾回收器,独占式
新生代串行回收器:复制算法
老年代串行回收期:标记压缩算法
2)新生代ParNewGC回收器:工作在新生代的垃圾回收器,使用复制算法,独占式
-XX:ParallelGCThread指定线程数,一般和CPU数量相当,小于8核设置为CPU数,大于8核3+((5*CPU_count)/8)
3)新生代ParallelGC回收器:工作在新生代的垃圾回收器,使用复制算法,关注系统吞吐量,独占式
-XX:MaxGCPauseMillis指定最大垃圾回收停顿时间
-XX:GCTimeRatio设置吞吐量n,默认99
-XX:UseAdaptiveSizePolicy,打开自适应调整GC策略,自动调整堆参数,自动调优
4)老年代ParallelOldGC回收器:工作在老年代的垃圾回收器,标记压缩算法,独占式
5)CMS(Concurrent Mark Sweep)回收器:工作在老年代的垃圾回收器,使用标记清除算法,关注系统停顿时间,非独占式,回收失败时,使用串行回收
-XX:ConcGCThreads或-XX:ParallelCMSThreads指定线程数,默认值=(ParallelGCThread+3)/4
-XX:CMSInitiatingOccupancyFraction回收阀值,默认68
-XX:UseCMSCompactAtFullCollection开启回收完成后做一次内存碎片整理
6)G1回收器:1.7以后新增回收器,取代CMS
-XX:+UseSerialGC 新生代、老年代都使用串行回收器
-XX:+UseParNewGC 新生代使用PerNew回收器,老年代使用串行回收器
-XX:+UseParallelGC 新生代使用Parallel回收器,老年代使用串行回收器
-XX:+UseParallelOldGC 新生代使用Parallel回收器,老年代使用ParallelOldGC回收器
-XX:+UseConcMarkSweepGC 新生代使用PerNew回收器,老年代使用CMS回收器
-XX:+UseG1GC 打开G1回收器
四.监控工具:
1)系统命令:top(整体资源情况)、vmstat(内存和cpu)、iostat(IO使用)、pidstat(全面(额外安装))
2)Java自带:jstat、jinfo(应用程序扩展参数)、jmap(生成堆文件,配合jhat堆分析工具)、jstack(导出线程堆栈)、jconsole(图形化性能监控)、jvisualvm(全能性监控工具、远程JMX)
3)第三方:JRockit中的Misson Control
五.内存溢出:
OOM(内存溢出)包括堆溢出,直接内存溢出,永久区溢出
1)堆溢出:java heap space
解决方式:调大-Xmx,通过visual VM分析占用大量堆空间的对象
2)直接内存溢出:OutOfMemoryError
解决方式:调大-XX:MaxDirectMemorySize
3)过多线程导致OOM:unable to create new native thread
解决方式:减少堆空间,增加栈空间
4)永久区溢出:OutMemoryError:PermGen space
解决方式:增加MaxPermSize,减少系统需要的类的数量
5)GC效率低下引起的OOM:GC overhead limit exceeded
六.Class装载系统
1)装载:流程(3+3)、装载条件(6)
2)装载详细:加载类(装载什么3、ClassLoader(分类(4)、全盘负责、双亲委托))、验证(验证什么、过程(4))、准备(准备什么)、解析(解析什么)、初始化(初始化什么)