Apusic应用服务器作为企业应用的运行平台系统的性能非常重要当应用对性能的要求比较苛刻时就要考虑是否需要改变系统的缺省设置来提升服务器的性能首先应该考虑系统的硬件环境(CPU主频高低内存大小硬盘转速及网络传输速率等)是否能满足应用的需求对于复杂的大型分布式企业应用硬件环境不应该仅仅满足Apusic应用服务器的最低要求配置而应该提高硬件配置使应用运行的绰绰有余如CPU和内存的使用率都不应大于%另一方面改变软件环境的配置参数对于性能的影响也非常显着本文就将介绍如何优化软件环境配置来提高系统性能分为两个方面Java虚拟机(JVM)的性能优化和Apusic应用服务器配置的优化
Java虚拟机(JVM)的性能优化
Java体系结构由四个不同却又相互关联的部分组成语言本身class文件格式JavaAPI库和JVM当执行一个Java程序时源代码是用Java语言写成它被编译成class文件格式运行在JVM中同时Java程序调用JavaAPI库的方法访问系统资源JVM和JavaAPI库形成了编译和运行环境就叫做Java平台JVM是基于堆栈的(stackbased)而不象汇编语言是基于寄存器的(registerbased)JVM是一个动态堆栈基础上的抽象的计算机体系结构提供了pushpop来操作数据JVM的主要功能是装载class文件执行字节码java平台的执行工作量分为四个部分
.字节码的执行JVM花费大概一半的时间来解释字节码
.Garbagecollection(垃圾回收)
.线程管理
.动态操作类装载绑定检查安全检查动态类装载异常捕获反射机制本地方法的翻译
其中对象的垃圾回收会占用运行时间造成程序的短暂中断
我们可以通过命令行方式来启动Apusic服务器这样就可以有选择的设置命令行参数使用命令行参数的主要目的是选择Java程序使用的JVM类型和JVM运行时占用堆内存的分配策略
使用HotSpot
HotSpotJVM作为javaSDK的一个附加模块使用了stateoftheart技术大大的提高了系统性能
.适应编译HotSpotJVM会在程序的运行过程中分析性能的瓶颈(hotspots)然后编译这些和性能提高最紧密的部分
.改善的Garbagecollection
.线程同步优化
HotSpotJVM使用两个机器字(twomachineword)作为对象的header而不象大多数JVM使用三个机器字这样大约可以节省%的堆内存空间加速了对所有对象的扫描
HotSpotJVM也丢弃了handle的概念对象引用的实现是通过直接指针减少了内存的使用和提高了处理速度访问实例变量象C语言一样的高效
可以去下载JavaHotSpotTMServerVM执行安装即可如果需要可以针对jdk和jre分别进行安装
HotSpotJVM分为client和server版本分别针对典型的客户端应用程序和服务器端应用进行了优化Jdk安装后就包含了JavaHotSpotClientVM上面安装的是JavaHotSpotServerVM
可以通过命令行参数选择要使用的JVM
;javaserverJavaHotSpotServerVM
;javahotspot:JavaHotSpotClientVM
;javaclassicJavaClassicVM
缺省情况是使用HotSpotClientVM可以用javaserverversion来查看版本信息确定是否以正确安装
只要针对不同的应用选择Client或ServerHotSpotVM对于Serverside应用有时性能会提高%只要简单的在命令行启动Server时加上server
GarbageCollection
HotSpotJVM提供了三种类型的垃圾回收算法分别是
.Copy/scavengecollection
.Markcompactcollection
.Incremental(train)collection
具体的含义我不解释了有兴趣可以查看相关的文档
一个JVM的吞吐量是指除去GC消耗的时间占总执行时间的百分比因此%的吞度量就是说GC消耗了%的JVM处理时间当你的应用程序运行时JVM的GC会造成程序的暂停
堆内存被分成了new和old两部分如下图
new部分包括新创建对象区和两个survivor区(SS#和SS#)新创建的对象分配内存在new中长时间存活的对象被移动到了old部分Perm是一个永久区域分配给JVM本省可以通过命令行参数XX:MaxPermSize=m来设置
当new被填满后会触发辅助GC把存在足够长时间的对象移动到old中当old中也被填满了会触发主GC将遍历堆内存中的所有对象可以看出主GC会消耗更多的时间足够大的new会适合需要大量创建存在时间很短的对象而old如果不够大会频繁的触发主GC大大降低了性能所以我们的任务就是如何设置堆内存的大小以及如何规划new和old区域的比例来适合我们应用
辅助GC使用Copy/scavengecollection算法主GC使用Markcompactcollection
Heap分配策略
通过命令行参数我们可以设置堆的大小和分配newold的比例一些常用参数如下
详细的参数设置请参看相关的文档
如何来规划我们的堆内存分配策略呢?没有一个明确详细的规定只能根据我们具体的应用进行调节使性能达到最优化这种优化方法不需要程序员改变代码但有时效果会很明显下面总结了一些操作建议
;如果GC成为了瓶颈请定制你的堆内存分配
;分配尽可能多的内存给JVM但如果过多会引起内存和硬盘之间的交换反而降低的性能你可以分配%的可用RAM给JVM
;如果是ServerSide应用请加server参数这样缺省的NewRatio是SurvivorRatio是适合大部分应用也可以用NewSizeMaxNewSize来设置
;设置Xms和Xmx的大小相等可以避免在每次GC后调整堆内存的大小;同样道理设置NewSizeMaxNewSize相等
;new的大小最好不要大于old的一半
例如可以通过下面的命令行启动Apusic服务器
javaserverXX:NewSize=mXX:MaxNewSize=mXX:SurvivorRatio=XmsmXmxmcomapusicserverMain
Apusic应用服务器配置的优化
下面主要说明Apusic中的两个文件影响性能的参数说明(这两个文件放在%APUSIC_HOME%\config目录中)及数据库中的设置
nf
把其中两个参数修改为
MaxClients参数值设置的目的是防止拒绝服务攻击当参数值设置较小时可以限制服务流量起到防止拒绝服务攻击的作用但是当访问的用户较多时而此参数设置较小时却会影响性能一般情况下不考虑防止拒绝服务攻击此参数设置为表示服务流量没有限制
MaxWaitingClients与MaxClients有类似的功能他表示当许多并发用户访问时可允许等待的最大客户服务数一般情况下不考虑防止拒绝服务攻击此参数设置为较大的数如如果设置较小如当等待响应的并发服务队列数超过时使得一些服务得不到响应从而丢失一些响应结果
datasourcesxml
minspareconnections指连接池最小容量
maxspareconnections指连接池最大容量
stmtcachesize指语句缓存容量
resultsetcachesize指结果集缓存容量
resultsetcachetimeout指结果集缓存超时配置如下……
连接池最小容量也就是初始连接数此值不宜设置太小太小须不断建立连接也不宜设置太大太大消耗资源
连接池最大容量连接池中可容纳的最大连接数当连接池中的连接数不够用时需要等待其他的被使用的连接得到释放才能使用否则只能等待根据应用的实际情况设置此值
语句缓存容量对所执行的语句进行缓存当再次执行此语句时不必重新编译从而提高了性能根据机器内存的大小适当设置此值
结果集缓存容量把所得到的结果集进行缓存当再次使用此结果集时不必再次从数据库中取得而可以直接从缓存中取得从而提高性能根据机器内存的大小适当设置此值
结果集缓存超时结果集过期时间此时间不宜设置过长以免浪费资源
注语句缓存容量结果集缓存容量结果集缓存超时参数主要针对Oracle数据库来设计的
通过适当的调节Java虚拟机和Apusic的配置文件可以显着的提升系统的性能在一些具体的应用中还能够通过增加实例池加大Cached改变并发策略等方法来改善系统的整体性能开发人员只要经过不断的总结就可以在Apusic应用服务器上开发出稳定而又高性能的企业应用