JVM 基本参数使用与调优及JVM分析工具初探

版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。 https://blog.csdn.net/zhouxingxingzxy/article/details/80284411

一、JVM参数类型

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。

二、使用jvm监控命令

一般用于查看服务运行时状态的主要命令包括: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

猜你喜欢

转载自blog.csdn.net/zhouxingxingzxy/article/details/80284411
今日推荐