JVM参数配置及性能监控工具
1、开启逃逸分析
java -server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations com.zrz.consoleapp.App
通过 -XX:+DoEscapeAnalysis(开启逃逸分析,默认打开)、XX:+EliminateAllocations(开启标量替换,运行将对象打散分配在栈上,默认打开),使得线程的私有变量(其他线程不会访问到的变量)的空间分配在线程栈上,而不是堆上。
jvm参数中,+号为打开指定功能,-号为关闭指定功能
2、输出GC日志
-XX:+PrintGC
-XX:+PrintGCTimeStamps(打印GC发生时的时间戳)
-XX:+PrintGCDetails (打印更加详细的GC信息,包括回收后堆空间的详细占用情况)
-XX:+PrintHeapAtGC (打印回收前、回收后的堆空间占用详细情况)
-XX:+PrintGCApplicationConcurrentTime (打印回收期间应用程序的执行时间)
-XX:+PrintGCApplicationStoppedTime (打印由于GC而产生的应用程序停顿时间)
-XX:+PrintReferenceGC (跟踪系统内软引用、弱引用、虚引用和Finalize队列)
-Xloggc:gc.log (将日志输出到文本文件)
3、跟踪类的加载/卸载
-verbose:class (跟踪类的加载/卸载)
-XX:+TraceClassLoading (跟踪类的加载)
-XX:+TraceClassUnloading(跟踪类的卸载)
-XX:+PrintClassHistogram (打印当前类的实例数和空间占用情况,需要再控制台按下 Ctrl+Break触发)
4、查看系统参数
-XX:+PrintVMOptions (打印当前系统参数)
-XX:+PrintCommandLineFlags (打印显示和隐式参数)
-XX:+PrintFlagsFinal(打印所有系统参数的值)
5、Java代码获取当前堆内存
Runtime.getRuntime().maxMemory()
Runtime.getRuntime().freeMemory()
Runtime.getRuntime().totalMemory()
6、新生代的配置
-Xmn (配置新生代大小。新生代的大小一般设置为整个堆空间的1/3到1/4。由于虚拟机垃圾回收的需要,新生代实际可用空间=新生代设置的大小-from/to的大小)
-XX:SurvivorRatio=eden/from=eden/to (设置新生代中eden区和from/to区的比例)
-XX:NewRatio=老年代/新生代 (设置老年代和新生代的比例)
基本策略:尽可能将对象预留在新生代,减少老年代GC的次数
7、堆空间不足时导出堆信息
症状:OutOfMemoryError异常
-XX:HeapDumpOnOutOfMemoryError (堆溢出时dump堆信息)
-XX:HeapDumpPath=dump.log (dump文件路径)
"-XX:OnOutOfMemoryError=printStack.bat %p” (bat文件内容 jstack -F %1 > stack.txt。堆溢出时调用bat脚本,导出线程栈dump信息)
8、方法区大小的配置
-XX:MaxMetaspaceSize
9、栈大小的配置
-Xss10m
10、垃圾回收算法
引用计数法(Reference Counting)
复制算法(Copying)
标记清除法(Mark-Sweep)
标记压缩法(Mark-Compact)
分代算法(Generational Collecting)
分区算法(Region)
11、Java虚拟机垃圾回收器
1)新生代串行回收器(复制算法)
-XX:+UseSerialGC
2)老年代串行回收器(标记压缩法)
-XX:+UseSerialGC :新生代和老年代使用串行回收器
-XX:+UseParNewGC :新生代使用ParNew回收器,老年代使用串行回收器
-XX:+UseParallelGC :新生代使用Parallel回收器,老年代使用串行回收器
3)新生代 ParNew 并行回收器(复制算法)
-XX:+UseParNewGC :ParNewGC回收器,只是使用了多线程方式回收,仍然是独占式的回收器
-XX:+UseConcMarkSweepGC :新生代使用ParNew回收器,老年代使用CMS
-XX:ParallelGCThreads :指定并行线程数量,一般为cpu数量最好
4)新生代 ParallelGC 并行回收器(复制算法)
-XX:+UseParallelGC :多线程、独占式、更关注系统吞吐量,新生代使用Parallel回收器,老年代使用串行回收器
-XX:+UseParallelOldGC :多线程、独占式、更关注系统吞吐量,新生代使用Parallel回收器,老年代使用ParallelOldGC回收器
-XX:+MaxGCPauseMillis :设置最大垃圾回收停顿时间
-XX:+GCTimeRatio:设置吞吐量,取值范围0~100的整数,回收的时间=系统执行总时间*1/(1+n)
-XX:+UseAdaptiveSizePolicy :自适应GC调节策略,新生代大小、eden区和survivor区的比例、晋升老年代的对象年龄等参数会被自动调整,仅需指定虚拟机的 Xmm、GCTimeRatio、MaxGCParseMillis
5)老年代 ParallelOldGC 并行回收器(标记压缩法)
-XX:+UseParallelOldGC : 多线程、独占式、关注系统吞吐量,新生代使用Parallel回收器,老年代使用ParallelOldGC回收器
-XX:ParallelGCThreads : 搭配使用,设置回收时的线程数量
-XX:-ScavengeBeforeFullGC :关闭Full GC之前的新生代GC
6)CMS回收器(标记清除法、标记压缩法)
回收过程:初始标记(Stop-The-World:标记根对象) -> 并发标记(标记所有对象) -> 预清理(清理前准备及控制停顿时间) -> 重新标记(Stop-The-World:修正并发标记数据) -> 并发清理(清理垃圾) -> 并发重置
-XX:+UseConcMarkSweepGC : 非独占式(默认启动GC并发线程数=(ParallelGCThreads+3)/4)
-XX:+CMSInitiatingOccupancyFraction :指定回收时老年代内存使用率的阈值,默认是68%
-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整
-XX:+UseCMSCompactAtFullCollection :使CMS在垃圾收集完成后,进行一次内存碎片整理,以减少因内存碎片太多,剩余空间不足以分配大对象,而导致触发CMS回收的概率
-XX:CMSFullGCsBeforeCompaction :设定进行多少次CMS回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled :使用CMS回收器回收Perm区
-XX:+CMSParallelRemarkEnabled : 是否开启并行标记
-XX:+DisableExplicitGC :禁止代码中显示GC(也就是 System.gc() 的调用不会触发gc)
7)G1回收器(分区算法,复制算法、标记清除法。全称:Garbage First Garbage Collector)
回收过程:新生代GC -> 并发标记周期【初始标记(Stop-The-World:标记根对象)-> 根区域扫描(扫描survivor区直接可达的老年代区域,并标记这些直接可达的对象)-> 并发标记(标记所有对象)-> 重新标记(Stop-The-World:修正并发标记数据)-> 独占清理(Stop-The-World:计算各区域存活对象和GC回收比例,并进行排序,识别可供混合回收的区域)-> 并发清理 (清理完全空闲的区域)】 -> 混合回收(回收垃圾对象比例较高的区域) -> Full GC(如果需要)
-XX:+UseG1GC
12、Linux性能监控工具
1)top
实时显示系统中各个进程的资源占用情况
2)vmstat
统计CPU、内存使用情况、Swap使用情况
3)iostat
提供详细的I/O信息,包括磁盘和cpu
4)pidstat
通过命令安装:apt-get install sysstat
线程的cpu占用情况:pidstat -p pid 1 3 -u -t
线程的io占用情况:pidstat -p pid 1 3 -u -t
进程的内存占用情况:pidstat -p pid -r 1 5
13、JDK性能监控工具
1)jps
列出Java进程
jps -v :显示传递给Java虚拟机的参数
2)jstat
观察Java应用程序运行时相关信息:堆信息、垃圾回收信息
垃圾回收信息:jstat -gcutil 1000 5
堆信息:jstat -gc 1000 5
3)jinfo
查看正在运行的Java应用程序的扩展参数,包括虚拟机参数
4)jmap
jmap -histo pid > dump.txt :对象统计信息
jmap -dump:format=b,file=heap.hprof pid :将堆快照输出到文件
5)jhat
jhat heap.hprof : 分析Java应用程序的堆快照内容,通过 http://127.0.0.1:7000 查看分析结果
6)jstack
jstack -l pid > stack.txt 导出线程堆栈信息
7)jstatd
远程主机信息收集
8)jcmd
JDK1.7新增的命令行工具,可以用来导出堆、查看java进存、导出线程信息、执行GC
查看Java进程:jcmd -l
导出堆:jcmd pid GC.heap_dump d.dump
导出线程信息:jcmd pid Thread.print > stack.txt
9)jConsole
图形化工具。可以监控堆信息、永久区使用情况、类加载情况、线程情况
10)Visual VM
图形化工具。可以替代jstat、jmap、jhat、jstack
11)JCA
线程堆栈图形化分析工具
12)jmc (JRockit Mission Control)
13)MAT
堆快照分析工具
with outgoing references : 找出当前对象应用的对象
with incoming references : 找出引用当前对象的对象
shallow heap :浅堆,表示一个对象自身结构所占用的内存大小
retained heap :深堆,表示一个对象被GC回收后,可以真实释放的内存大小(实际大小包括仅被该对象引用的对象的大小)
Dominator Tree :支配树,可查看占用内存最大的对象。 所有指向对象B的路径都经过对象A,则认为对象A支配对象B
注意:MemoryAnalyzer.ini文件中的xmx配置默认为1024m,需调整为一个大一点的数