jvm参数类型一般包含以下三种类型:标准参数、X参数和XX参数。
1.1参数类型说明
1.1.1标准参数
功能和输出已经稳定得,在未来的JVM版本中不会修改的参数。
图1.jvm标准参数列表
1.1.2 X参数
非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始可以使用java -X检索。
常用的于java程序配置的X参数有:-Xms(设置堆区的初始内存)、-Xmx(设置堆区的最大内存)、-Xmn(设置新生代的大小)、-Xss(设置线程栈的大小)。
-Xms和-Xmx是当前智学组件启动的必备参数,指定了组件初始的内存大小以及最大可使用内存的大小,通常这两个值配置相同的数值;这两个参数整体上决定了组件可实例化的对象的能力(业务处理能力)。配置示例:-Xms2g/-Xmx2g或者-Xms2048m/-Xmx2048m(配置大小单位g、m、k)。如果内存剩余不到 40 %, JVM 就会增大堆到 Xmx 设置的值,内存剩余超过 70 %, JVM 就会减小堆到 Xms 设置的值。所以服务器的 Xmx 和 Xms 设置一般应该设置相同避免每次 GC 后都要调整虚拟机堆的大小。
-Xmn:设置堆中新生代的大小,在一定范围内适当提高新生代的占比可以提高服务的吞吐量,但是服务的吞吐量与新生代的大小并不正相关。sun建议该值取整个堆大小的3/8。
-Xss:设置组件中线程栈的大小。如果线程中的调用过深,压栈对象过多导致占用栈内存的大小超过了线程栈设置的大小,会出现stackOverflow异常。可根据组件中的具体情况设置线程栈的大小。配置示例:-Xss256k,线程栈分配占256k的内存空间。内存大小一定的情况下,该值设置的越小进程内可创建的线程就越多。
图2.jvm X参数列表
1.1.3 XX参数
非标准参数,用于JVM开发的debug和调优,参数以-XX:开始。-XX:参数名称
例如,-XX:MaxPermSize=128m,设置持久代的最大内存可以设置为 128m;如果持久代存储空间不够创建新对象时,会报java.lang.OutOfMemoryError: PermGen space 内存溢出错误。一般解决方法:Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
有些XX参数和X参数是有相同对应关系的,比如-XX:InitialHeapSize的缩写形式为–Xms, -XX:MaxHeapSize的缩写形式为-Xmx。
一般用于查看服务运行时状态的主要命令包括:jstat、jmap、top、jstack。
2.1 简介
其中,jstat 用于查看服务器上某个服务的GC情况。一般使用方式jstat –gc[util]pid 时间间隔—每个一定时间(指定的时间间隔)输出一次进程pid的内存情况及gc情况。
top用于查看机器上各个进程占用系统资源的情况,按资源占用资源(cpu、memory)的多少倒序排列占用资源较多的进程。
jamp用于查看进程的内存使用情况(分析内存溢出)。一般使用命令 jmap –heap pid 或者 jmap –histo[:live]pid,以及 jmap –dump[:live],format=b,file=xx-heap.hprof pid 会dump堆内存的使用情况到一个指定的文件。当heap内存占用比较大时,执行jmap –dump 会比较耗时。
jstack查看线程的运行状态。一般使用命令 jstack pid | grep tid(16进制)-A 30,堆栈分析过程可参考(java命令--jstack 工具)。
2.2 综合应用
GC问题分析借助内存dump文件进行分析—未完待续。
1) 保存出问题时的进程的内存信息—dump文件。
2) 使用dump文件分析工具MAT(使用jmap和MAT分析JVM堆内存)
一般分析组件问题可以经过一下几个步骤定位异常问题(高CPU、线程死锁):
1.查看占用资源最多的进程(按占用资源量倒序)
top [| more]
2.查看某进程的gc情况
jstat -gcutil pid [打印间隔时间] [打印次数]
该命令主要用于查看进程的内存使用情况(GC情况)
3.查看进程内线程占用资源情况
ps -mp pid -o THREAD,tid,time | sort -rn | more
输出线程id,时间
功能类似的命令:top –Hp pid 或者ps –Lfp pid(重点关注输出结果中time 列数值较大的线程)
4.查看线程信息(根据3查到的线程id(转为16进制), 终端使用 printf “%x\n” tid 可将十进制线程号转为十六进制)
jstack pid | greptid(16进制) -A 30
(-A 30表示查找到所在行的后30行)
5. dump 线程信息,把服务运行时线程调用的堆栈信息以文件形式保存下来,便于排查类似内存溢出、线程死锁等问题。
jstack pid >/PATH/xx-threaddump.txt
线程堆栈信息中线程状态说明:对于thread dump信息,主要关注的是线程的状态和其执行堆栈。线程的状态一般为三类:
1.Runnable(R):当前可以运行的线程
2.Waiting on monitor(CW):线程主动wait
3.Waiting for monitor entry(MW):线程等锁
一般关注的都是第一和第三种状态的线程
Cpu很忙则关注runnable的线程
Cpu闲则关注waiting formonitor entry的线程
一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源,解决办法就是将该servlet放到另外的执行队列里去执行。综合使用过程参考:JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)、jstack和线程dump分析。
1.JVM参数使用总结
2.tomcat启动参数Xms, Xmx, XX:MaxNewSize, XX:PermSize,-XX:MaxPermSize, Djava.awt.headless
3.深入解析OutOfMemoryError