JVM性能调优
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JVM性能调优
一、引言
本文的读者是技术支持人员。阅读本文后,你将理解jboss的启动脚本文件(run.sh)中有一系列的JVM配置参数的含义,以及如何调整它们,从而使得MegaEyes中心管理服务器的性能得到优化。
MegaEyes中心管理服务器的性能调优涉及到系统的多个方面,包括MegaEyes应用本身、应用服务器(jboss)、数据库和java虚拟机(JVM)等等。本文重点介绍JVM的性能优化。
需要注意的是,JVM性能调优具有应用独特性(application specific),就是说,不同的应用情形应该有不同的调整方案,这就要求你首先要观察JVM的运行状态,然后根据观察结果调整参数。没有一个通用的调优方案可以适用于所有的MegaEyes应用。
什么是性能调优
对性能调优,不同的人有不同的理解,本文是指对下列指标最大化:
⏹并发用户(concurrent users),在服务请求失败或请求响应超过预期时间之前,系
统支持的最大并发用户数量。
⏹系统容量(throughput),可以用每秒处理的事务(transaction)数量计算。
⏹可靠性(reliability)
换句话说,我们想对更多的用户提供更快捷的、不会中断的服务。
JVM性能调优的重点
JVM的性能调优的重点是垃圾回收(gc,garbage collection)和内存管理。垃圾回收的时候会导致整个虚拟机暂停服务,因此,应该尽可能地缩短垃圾回收的处理时间。
JVM内存
JVM占用的内存称为堆(heap),它被分为三个区:年轻(young,又称为new)、老(tenured,又称为old)和永生(perm)。这三个区是按照java对象的生存期划分的,在new区的对象生存期最短,很快就会被gc回收;perm区的对象生存期最长,与JVM同生死。Perm区的对象不会被gc回收。
new区又被分为三个部分:伊甸园(eden)和两个幸存者(survivor)。对象的创建总是在eden部分(这大概就是命名该部分为eden的原因吧)。两个survivor中总有一个是空的,它作为另一个survivor的缓冲区。当gc发生时,所有eden和survivor中活下来的对象被移动到另一个survivor中。对象会在两个survivor之间不断移动,直到活得足够久,然后移动到old区。我们可以猜想,之所以如此划分使用内存,肯定是为了缩短gc的执行时间,提
高gc的执行效率。
垃圾回收算法
除了默认的垃圾回收算法外,JVM还提供了两个:并行(parallel)和并发(concurrent),前者作用在new区,后者作用在old区。两者可以同时使用。
并行算法会产生多个线程以提高执行效率。当有多个cpu的时候,它会显著缩短gc的工作时间。
并发算法可以在JVM不中断对应用的服务的情况下执行(通常情况下,在gc工作的时候JVM停止对应用的服务)。
二、性能参数
比较大的。
三、性能参数调优
要调整参数首先要观察它们。观察JVM内存和gc的工具很多,jdk本身也提供了一些,这些工具简单、实用,而且不需要安装。其中,最常用的是jps和jstat,前者用来查看JVM 的进程id(pid),后者用这个pid作为参数来得到内存和gc的状态,就是说,在执行jstat 之前必须用jps得到JVM的pid。Jstat的例子::
jstat -gcutil 21308 250 10
其中,21308是(运行jboss)的JVM的pid;250是采样间隔,单位是毫秒,即250毫秒采集一次数据;10是采样次数。
上述命令的执行结果如下:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
0.00 0.00 11.39 5.29 13.57 328 1.955 327 133.126 135.081
我们可以将采样次数设置足够大,这样就可以看到内存和gc的变化了。
从上述数据可以看出,内存各区域的占用率都不高,gc的执行时间都不长,不过,perm 区有些太大,太浪费了。因为perm区的对象与JVM的生命周期是一样的,对象数量不会动态变化,所以,我们可以把这个区域的尺寸设置为原尺寸的二分之一,这样,perm的占用率将从13%左右增加到26%左右。
从上述数据还可以看出,new区的gc明显比真个heap的gc快得多。通常,FGC应该不超过400毫秒,否则,将严重影响java应用的正常运行。
参考文档
全球眼平台调优方案.doc