??xml version="1.0" encoding="utf-8" standalone="yes"?> |址Q?A >http://www.quest.com/jprobe/ The Sandbox
jProbe是由Quest公司开发的一个强大的java性能分析Q调优工P实际上,jProbe的功能还不止在性能斚wQjProbe׃下几个品组成:(x)
JProbe Memory Debugger-查Java软g的内存用情c(din)可以统计出当前q行的java代码那些对象在消耗内存,消耗了多少{等?BR>JProbe Profiler-剖析Java软g的性能。可以统计出当前q行的javaE序p行了那些Ҏ(gu)Q每个方法用了多少ơ,每次的^均时间以?qing)篏U时间等Q还能绘制出Ҏ(gu)间相互调用的C意图,q以不同的颜色表达耗时的区别?BR>JProbe Threadalyzer-识别U程U的死锁和错误的讉K冲突
JProbe Coverage-通过提供的语句执行信息验证试框架的完整性。可以统计出在一D|间内Q共q行了那些方法,q些Ҏ(gu)的代码覆盖率有多,q可以在源文件中标示出那些代码被q行了,哪些没有?/P>
Tapestry
Tapestry是一个新一代的webapp开发框架。主:(x)http://jakarta.apache.org/tapestry/index.html
是一U抛弃了jsp的应用框?BR>
HiveMind
HiveMind是一个代码构架框?基本的思想也是iocQ越看越像springQ不q应该应用在不同的场合吧Q学?fn)中。主?http://jakarta.apache.org/hivemind
Commons下的lgQ?/STRONG>
Commons下很多组仉很有用,也许你会(x)发现辛辛苦苦写了半天的东西在q里面就有了Q比如DBCPQBeanUtilsQMail和FileUpload{等?BR>
地址:http://jakarta.apache.org/commons
Components
Attributes Attributes provides a runtime API to metadata attributes such as doclet tags, inspired by the Nanning and XRAI projects as well as JSR 175 and C# attrbutes.
BeanUtils Commons-BeanUtils provides easy-to-use wrappers around the Java reflection and introspection APIs.
Betwixt Betwixt provides services for mapping JavaBeans to XML documents, and vice versa.
Chain Chain provides a "Chain of Responsibility" pattern implemention for organizing complex processing flows.
CLI CLI provides a simple API for working with Comamnd Line arguments, options, option groups, mandatory options and so forth.
Codec Codec contains some general encoding/decoding algorithms. Includes some phonetic encoders, Hex, Base64, and a URL encoder.
Collections Commons-Collections provides a suite of classes that extend or augment the Java Collections Framework.
Configuration Commons-Configuration Tools to assist in the reading of configuration/preferences files in various formats.
Daemon An alternative invocation mechanism for unix-daemon-like java code.
DBCP Commons-DBCP provides database connection pooling services.
DbUtils DbUtils is a JDBC helper library that factors out mundane resource cleanup code for common database tasks.
Digester Commons-Digester is an XML-to-Java-object mapping utility commonly used for parsing XML configuration files.
Discovery Commons-Discovery provides tools for locating resources (including classes) by mapping service/reference names to resource names using a variety of schemes.
EL Commons-EL provides an interpreter for the Expression Language which is defined by the JavaServer Pages(TM) specification, version 2.0.
Email Email provides a simple library for sending e-mail from Java.
FileUpload FileUpload makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.
HttpClient Commons-HttpClient provides a framework for working with the client-side of the HTTP protocol.
IO IO is a collection of I/O utilities.
Jelly Jelly is an XML based scripting and processing engine. Jelly borrows many good ideas from both JSP custom tags, Velocity, Cocoon and the scripting engine inside XDoclet. Jelly can be used from the command line, inside Ant or inside a Servlet.
Jexl Jexl is an expression language which entends the Expression Language of the JSTL by bringing in some of the lessons leaned by the Velocity community.
JXPath Commons-JXPath provides utilities for manipulating Java classes that conform to the JavaBeans naming conventions using the XPath syntax. It also supports maps, DOM and other object models.
Lang Commons-Lang provides a very common set of utility classes that provide extra functionality for classes in java.lang.
Latka Commons-Latka is an HTTP functional testing suite for automated QA, acceptance and regression testing.
Launcher The Launcher Component is designed to be a cross platform Java application launcher. Commons-launcher eliminates the need for a batch or shell script to launch a Java class. The original Java classes come from the Jakarta Tomcat 4.0 project.
Logging Commons-Logging is a wrapper around a variety of logging API implementations.
Math Math is a library of lightweight, self-contained mathematics and statistics components addressing the most common practical problems not immediately available in the Java programming language.
Modeler Commons-Modeler provides mechanisms to create Model MBeans compatible with the Java Management Extensions (JMX) specification.
Net Net is a a collection of network utilities, based on the NetComponents codebase, including FTP clients etc.
Pool Commons-Pool provides a generic object pooling interface, a toolkit for creating modular object pools and several general purpose pool implementations.
Primitives Commons-Primitives provides smaller, faster and easier to work with types supporting Java primitive types. Currently Primitives is primarily focused on collections of primitives.
Resources Resources provides a lightweight framework for defining and looking up internationalized message strings keyed by a java.util.Locale and a message key.
Transaction Commons Transaction provides implementations for multi level locks, transactional collections and transactional file access and some other utility classes commonly used in transacional Java programming.
Validator The commons-validator package provides a simple, extendable framework to define validators (validation methods) and validation rules in an xml file. There is support for internationalization of validation rules and error messages.
VFS VFS is a Virtual File System component for treating files, FTP, SMB, ZIP and such like as a single logical file system.
This project also contains a workspace that is open to all Jakarta committers. It's a place to try out new ideas and prepare for inclusion into the Commons portion of the project or into another Jakarta project. Users are free to experiment with the components developed in the sandbox, but sandbox components will not necessarily be maintained, particularly in their current state.
Sandbox
Cache Cache provides object caching services.
Clazz Clazz focuses on introspection and class manipulation.
Compress Commons Compress defines an API for working with tar, zip and bzip2 files.
Contract This component makes all the nice features available to the java programming language that come along with contract based programming.
Convert Commons-Convert aims to provide a single library dedicated to the task of converting an object of one type to another.
Events Commons-Events provides additional classes for firing and handling events. It focusses on the Java Collections Framework, providing decorators to other collections that fire events.
Feedparser Generic FeedParser interface and concrete implementations for Atom, FOAF, OPML and RSS.
Functor A functor is a function that can be manipulated as an object, or an object representing a single, generic function.
I18n This component adds the feature of localized message bundles that consist of one or many localized texts that belong together. Think of an error message that consists of title, text, summary and error details.
Id Id is a component used to generate identifiers.
Javaflow Continuation implementation to capture the state of the application.
JCI Java Compiler Interface
JJar Jakarta JAR Archive Repository
Mapper Mapper is a thin abstraction layer around a project's chosen data mapping technology (a.k.a. DAO pattern).
Messenger Messenger is an easy to use and lightweight framework for working with JMS in the web tier.
Pipeline This component provides a set of pipeline utilities designed around work queues that run in parallel to sequentially process data objects data objects.
Scaffold Scaffold is a toolkit for building web applications.
SQL Commons SQL is a component for working with databases and generating DDL. It contains a simple set of beans that represent a relational database schema such as a Database, Table, Column etc.
ThreadPool ThreadPool is a simple component for asynchronously dispatching work to another thread in a pool for simple multi threaded programming.
Workflow Workflow provides a framework for building workflow management systems.
XMLIO Simple and fast importer for XML configuration or import files.
JRockit是一个自适应的JVMQ它能够自动调整自己去适应底层gQ因此对它的调优主要集中在一些需要h工干预的参数上,比如_(d)(x)需要划分多RAMlJRockit使用{。JRockit有一l非标准?X启动选项Q我们可以用它来调节JVM。JRockit有两l主要的子系l可以被优化--内存理pȝQ包括垃圑֛Ӟ和线E系l。在内存理子系l方面,有很多调优的工作可以做?
二.Tuning WebLogic JRockit JVM
1Q设|初始堆寸
可以通过-Xms:<size>m来设|初始堆大小Q如?Xmx的值小?28MBQ则-Xms~省取gؓ(f)16MBQ如?Xmx讄大于128MBQ则-Xms~省gؓ(f)物理内存?5%Q最大不过64M。例子:(x)
-Xgc:gencon -xms:64m -Xmx:64m myClass
2Q设|最大堆寸
可以通过-Xmx:<size>m来设|最大堆寸。在IA32构架下,׃操作pȝl每个进E的最大内存寻址I间?.8GQ因此最大堆寸不能过1.8G。在IA64构架下,没?.8G的限制?BR>如果你的JAVA应用E序在运行时出现了Out of memory的错误,你就需要调大最大堆寸。如果没有设|最大堆寸Q则~省gؓ(f)Q?BR>1Q?如果讄?Xgc:gencopyQ由最大堆寸是min{400, 物理内存*75%}Q?BR>2Q?如果没有讄-Xgc:gencopyQ由最大堆寸是min{1536, 物理内存*75%}Q?BR>最好手工把最大堆寸讄为物理内存(1024MQ的75%Q?BR>-Xgc:gencon -xms:64m -Xmx:768m myClass
3Q设|Nursery的尺?/B>
可以使用-Xns:<size>来设|Nursery的尺寸,我们要在保证垃圾回收停顿旉Qgarbage collection-pauseQ尽可能短的同时Q尽量加大Nursery的尺寸,q在创徏了大量的临时对象时尤光要。缺省gؓ(f)Q?BR>1Q?对于-Xgc:gencopyQ缺省的Nursery大小?20KB/CPUQ对?0个CPU的系l来_(d)Nursery大小?200KBQ?.2MQ?BR>2Q?对于-Xgc:genconQ缺省的Nursery大小?0M/CPUQ对?0个CPU的系l来_(d)Nursery大小?00M
4Q定义内存空间的清理时机
可以使用-Xcleartype:<gc|local|alloc>来定义已l被垃圾回收的内存空间在什么时候可以被清理Q支持以下三U方式:(x)
1Q?gcQ在垃圾回收的同时清理内存;
2Q?localQ在分配了一块thread-local区域时清理内存,仅在把参?Xallocationtype讄成local时才有用Q?BR>3Q?allocQ在q块内存被分配给其它对象时清理。在IA64上目前还不支持?BR>~省gؓ(f)Q?BR>1Q?IA32上缺省gؓ(f)alloc
2Q?IA64上缺省gؓ(f)gc
5Q定义线E分配的cd
可以使用-Xallocationtype:<global|local>来定义线E分配的cd?BR>1Q?globalQ在最大堆寸比较?yu)时Q小?28MQ或者应用程序大量用了U程时用?BR>2Q?localQ在最大堆寸比较大时Q大?28MQ或者应用程序少量用了U程时用?BR>~省|(x)
1Q?如果讄?Xgc:gencopyQ缺省gؓ(f)global
2Q?如果讄?Xgc:sigleconQ?Xgc:gencon?Xgc:parallelQ缺省gؓ(f)local
6Q定义线E栈寸
可以使用-Xss<size>[k|K][m|M]来定义线E栈大小。最线E尺寸定义如下:(x)
1Q?thin threadsQ最线E栈寸?KQ缺省ؓ(f)64KQ?BR>2Q?native threadsQ最线E栈寸?6K
如果-Xss讄于最|则自动用最倹{?BR>~省|(x)
1Q?IA32pȝQW(xu)IN32Q?4KQLINUX32Q?28K
2Q?IA64pȝQW(xu)IN64Q?20KQLINUX64Q?M
二.Basic Tuning Tips and Techniques
管JRockit提供了一l缺省的OOTB配置选项Q但最好根据实际应用情冉|对JRockit作一些调整?BR>1Q决定你要在哪方面调?/B>
要考虑的因素有Q?BR>1Q?要ؓ(f)JRockit分配多少内存I间Q?BR>2Q?你要调优的目的是什么,是要得到更好的响应性还是更好的性能Q?BR>2Q设|堆寸
对于堆尺寸来_(d)当然是越大越好了。如果设得不够大Q就?x)造成Out-of-memory和内存分错。如果同时运行了多个应用E序Q徏议把最和最大堆寸讄成一样大?BR>3Q在高响应性方面的调优
要得到更好的响应性能Q应该设|?BR>1Q?使用q发垃圾回收器?Xgc:gencon
2Q?讄初始和最大堆大小?Xms512mQ?Xmx768mQ由于用了q发垃圾回收器,所以堆大小不会(x)造成长时间的{待?BR>3Q?讄nursery寸。如果用C大量的(f)时对象,则需要适当的调大nursery寸。调大nursery寸?x)导致垃圑֛收的停顿旉加长Q因此要注意Q确保垃圑֛收的停顿旉在可忍受的范围内Q这个停时间可以通过讄-Xgcpause来查看?BR>4Q在高性能斚w的调?/B>
如果要得到更好的性能Q你应该Q?BR>1Q?选用q行垃圾回收器,׃q行垃圾回收器不使用nurseryQ因此你不必再设|?XnsQ方法是加上-Xgc:parallel
2Q?把初始和最大堆寸讄调到可能的大。方法是-Xms512m, -Xmx768m?BR>5Q分析垃圑֛收和停顿旉
1Q?使用-Xgcreport生成报表Q显C垃圑֛收的l计信息Q从中可以看Z是不是最有效C用了垃圾回收器?BR>2Q?使用-Xverbose:memory来显C在q行期间每一ơ垃圑֛收的停顿旉。本选项仅用于调试,?x)生大量的控制台输出?BR>6Q调整线E选项
当大量地使用了线E时Q超q?00个)Q需要调整线E选项Q?BR>1Q?使用thinU程选项?Xthinthreads。瘦U程模式在LINUX下非常有效。注意:(x)瘦线E在JRockit中只是一个试验选项Q不推荐q泛使用Q?BR>2Q?关闭本地分配U程的选项?Xallocationtype:global。每个本地线E区都要消耗大U?K的内存,如果大量C用了U程Q本地线E不但会(x)造成内存I间费Q而且q会(x)造成堆碎片。用全局U程机制?x)减堆片Q但在内存分配方面速度要慢一些?BR>7Q分析ƈ改善应用E序设计
扑և瓉Ҏ(gu)Q?BR>1Q?使用Intel VTune工具Q?BR>2Q?使用-Xjvmpi:allocs=off,monitors=off,entryexit=off选项?/P>
三.Command Line Options by Name
启动JRockitӞ可以带一?X选项Q这些选项是非JVM标准的,专门用于配置JRockit的性能?BR>
选项 |
描述 |
-X |
昄扩展Java选项 |
-Xallotype -Xallocationtype |
可取值global和localQ定义用本地线E还是全局U程?/P> |
-Xbootclasspath |
指定cL索\径,可以是ZIP和JAR文gQ以Q或Q分?/P> |
-Xcleartype |
定义内存清理时机Q可取值gc, local, alloc。gc表示在垃圑֛收时清理内存Qlocal表示时分配一块localU程区时清理Qalloc表示内存被分配给其它对象时清?/P> |
-Xgc |
选择要用的垃圾回收器的cdQ可取|(x) gencopyQgenerational copying singleconQsingle spaced concurrentQ单I间q发 genconQgenerational concurrent parallelQparallel 如果-Xmx于128MQ缺省用gencopyQ否则用gencon |
-Xgcpause |
打印由垃圑֛收器造成的停时?/P> |
-Xgcreport |
打印垃圾回收报表 |
-Xjvmpi |
是否允许JVMPI事gQ这些事件有Q?/P> entryexitQ缺省ONQ?/P> allocsQ缺省ONQ?/P> monitorsQ缺省ONQ?/P> arenasdeleteQ缺省OFFQ?/P> |
-Xmanagement |
ȀzJVM中的理服务器,在JVM的管理控制台能连接到它之前,必须先激zR?/P> |
-Xms |
讄初始堆大,单位有K、M、G |
-Xmx |
讄最大堆大小Q单位有K、M、G |
-Xnativethreads |
使用本地U程pȝQ这是缺省选项 |
-Xnoclassgc |
止对类作垃圑֛?/P> |
-Xnohup |
告诉JRockitQ忽略CTRL_LOGOFF_EVENT和SIGHUP事g |
-Xns |
讄nursery寸Q单位有K、M、G |
-Xss |
讄U程栈尺寸,单位有K、M、G |
-Xthinthreads |
使用JRockit的高性能U程pȝQ在IA64上不可用?/P> |
-Xverbose |
让JRockit打印更多的信息,可选的参数有:(x) codegen、cpuinfo、gc、load、memory、Opt |
-Xverify |
作完整的bytecode一U的校验 |
四.用JRockit8.1中的Method Profiler调优WebLogic
1Q关于Method Profiler工具
BEA WebLogic JRockit 8.1提供了一个Profiling工具QMethod Profiler来调优WebLogic应用?BR>2Q利用Method Profiler调优WebLogic应用
JRockit 8.1所带的Method Profiler工具能够所有在JRockit Java虚拟Z执行的成员方法的调用ơ数、执行的L间和每次调用的执行时间都l计出来Q如?所C。这L(fng)功能一来可以让我们对跑在WebLogic上的应用q行tuningQ代码的)Q二来也大大方便了我们确定系l瓶颈在何处。这也可以说是JRockit JVM相对于其他JVM在功能上的一大优ѝ?BR>
在一ơ对WebLogic Server 8.1的压力测试中Q对一l包含了CMPҎ(gu)的hq行压力试Ӟ利用JRockit的Method Profiler诊断Zpȝ的瓶颈所在,Cl如下。CMPq组h中原先对CMP Entity Bean的操作除了用ejbCreate插入一条记录之外,紧跟着用setNameҎ(gu)讄其name属性,即UPDATE其对应数据库记录中name域的|代码如下Q?BR>public void ejbCreate() //Stateful4CMPBean中的Ҏ(gu)
throws CreateException
{
try
{
Context ctx = new InitialContext();
SheepHome home = (SheepHome)ctx.lookup("Sheep");
Sheep sheep = null;
int x = getNextId(); // getNextId()也包含对数据库的操作
sheep = home.create(x);
if(sheep != null)
{
sheep.setName("sheep1".concat(String.valueOf(String.valueOf(x))));
m_strMsg = "create sheep".concat(String.valueOf(String.valueOf(x)));
} else
{
m_strMsg = "The sheep name is not created.";
}
}
catch(Exception e)
{
m_strMsg =
"*** some exception occured! (CMP) ".concat(String.valueOf(String.valueOf(e.getMessage())));
}
}
此时出来的数据QTPSq_值非怽Q且试时Response TimeL随着旉的增长几乎呈U性攀升。于是用Method Profilerq行诊断Q?BR>Q?Q?在JRockit的启动参C加入-XmanagementQ以便启动JRockit的时候同时启动其Management Server?BR>Q?Q?启动JRockit Management ConsoleQƈ且将其连接到启动了的Management Server上。(在做压力试时用JRockit Management Consoleq行观察Ҏ(gu)能的损耗可以忽略不计)
Q?Q?在JRockit Management Console中,ToolsàPreferences菜单中的Mode of operation属性设为developer?BR>Q?Q?在Method Profiler属性页中添加你所需要观察的cȝ成员Ҏ(gu)?BR>Q?Q?按Start按钮让Method Profiler开始进行统计?BR>Time/Inv(ns)指标的显C结果表明Stateful4CMPBean.ejbCreate()代码所含逻辑成ؓ(f)了系l的瓉。结果又昄getNextId()和home.create()操作消耗的旉只占Stateful4CMPBean.ejbCreate()的一部分,而sheep.setName()操作消耗的旉却占了Stateful4CMPBean.ejbCreate()的剩下的Q指除去getNextId()和home.create()操作消耗的旉Q绝大部分?BR>于是又用Method Profiler作了一pd实验Q结果如下:(x)?个用户做压力试Qsheep.setName()操作消耗的旉为XQgetNextId()操作消耗的旉为YQhome.create()操作消耗的旉为ZQ用2个用户做压力试Qsheep.setName()操作消耗的旉Uؓ(f)2XQgetNextId()操作消耗的旉Uؓ(f)YQhome.create()操作消耗的旉Uؓ(f)ZQ用3个用户做压力试Qsheep.setName()操作消耗的旉Uؓ(f)3XQgetNextId()操作消耗的旉Uؓ(f)YQhome.create()操作消耗的旉Uؓ(f)Z。可以比较肯定地判断Qsheep.setName()执行的是一个串行化的逻辑。检查Oralce中UPDATE的ISOLATION-LEVELQ果然ؓ(f)SERIALIZABLE?BR>sheep.setName("sheep1".concat(String.valueOf(String.valueOf(x)))); q句代码删掉?BR>重新试QTPSq_值有很大q度的提高,Response Time在压力测试开始一D|间后也趋于^EI几乎呈水q线走势?/P>
默认情况下,一个servlet实例会(x)产生多个U程来同时响应多个请求?o:p>
如果某个servlet实现SingleThreadMod旗标接口Q那么这个servlet会(x)自动拒绝多\q行h的模式。在q种情况下,weblogic?x)生一个servlet实例池来满单线E的要求?o:p>
目前Q应该尽量避免用单U程模式的servletQ如果需要在大容量的pȝ中用单U程模式的servletQ那么应该调整如下的参数Q?o:p>
Single Threaded Servlet Pool Size q个参数可在weblogic.xml或者在weblogic控制Cwebapplication菜单---?/SPAN>configuration?/SPAN>---?/SPAN>Descriptor 子页中进行设|?/SPAN>
默认?/SPAN>5?/SPAN>
2?/SPAN>Weblogic生模式下会(x)自动监测servlet?SPAN lang=EN-US>jsp的更Ҏ(gu)况,在品模式下Q不需要这些检查,可以通过下面的参数更改:(x)
JSPPage Check Secs?B style="mso-bidi-font-weight: normal">Servlet Reload Check Secs均设?SPAN lang=EN-US>-1q两Ҏ(gu)weblogic?SPAN lang=EN-US>jsp
?SPAN lang=EN-US>servlet的时间间隔。设|ؓ(f)-1Q?SPAN lang=EN-US>weblogic不再检查?SPAN lang=EN-US>关闭JSPKeep Generated?/SPAN>JSPVerboseQ品模式下也不需要这两个选项?/SPAN>
Enable JSP Line Numbers q个选项是启?/SPAN>jsp行号的选项Q启用行L(fng)目的是用来支持调试,有些IDE可以?/SPAN>jsp生成?/SPAN>java源代码中讄断点用于调试。生产模式中也不需要?/SPAN>
注意Q在产品发布模式下,L(fng)止对servlet和jsp的变更检查,q样除了能提高效率以外,q可以防止用上传文g的方式对服务器的d。如果需要更改servlet和jspQ可以重新部|应用?o:p>
3?/SPAN>Session?/SPAN>cookie的相关配|?/SPAN>
概念?x)?/B>cookieQ如果不讄q期旉Q则表示q个cookie的生命期为浏览器?x)话期间Q只要关闭浏览器H口Q?/SPAN>cookie消׃。这U生命期为浏览器?x)话期?/SPAN> cookie被称Z(x)?/SPAN>cookie?/SPAN>
Session Cookie Max Age Secs 是?x)?/SPAN>cookie的超时时_(d)讄于0表示不限制?/SPAN>
Session Invalidation Interval Secs 查过?/SPAN>session的周?/SPAN>
Session Timeout Secs session的超时时?/SPAN>
4?/SPAN>Jdbcq接池的配置
URL q接池地址
Driver Classname Q?/SPAN>jdbc驱动cd
Properties Q属性,例如user=examples
Password Q密?/SPAN>
Initial Capacity Q初始连接数
Maximum Capacity Q最大连接数
Capacity Increment Q连接池每次增加q接的数?/SPAN>
Statement Cache Type Q?/SPAN>prepared statements~存的策略,LRU法在有新的语句到来Ӟ最不经常被用得语句调整出缓存?/SPAN>FIXED法为先q先出的法
服务器启动,׃(x)l定到相应的端口QƈZ个端口分配一个线E以接受q接hQ一旦服务器接受到连接请求ƈ建立好连接以后,监听U程处理权交给套接字复用器Q套接字复用器进行一定的处理Qƈ?x)负责选择利用那个执行队列q将h|入其中。当有一个请求进入执行队列,׃(x)有一个空闲的执行县城从该队列里面取走q向调用者返回结果?/SPAN>
(? 执行队列和执行线E的相关配置
执行U程数量有一定的限制Q在服务器启动的时候,已lŞ成了一个含有一定数量执行线E的池,执行U程可能?/SPAN>servletQ?/SPAN>ejb?/SPAN>jdbc{,׃执行U程仅当E序成功l束或者出现异常才能被释放l箋处理其他hQ所以如果执行线E执行的不够快,而请求又多的情况下,׃(x)造成执行队列的阻塞?/SPAN>
相关的配|信息有Q?/SPAN>
server菜单?/SPAN>?/SPAN>configuration?/SPAN>---〉高U配|?/SPAN>---?/SPAN>Config Execute Queues中的配置如下:(x)
1?/SPAN>Queue Length队列长度Q执行队列的长度
2?/SPAN>Queue Length Threshold Percent 一个百分数Q当request的数量达到队列长度的q个比例的时候,weblogic?x)发?/SPAN>overflow的标志信息?/SPAN>
3?/SPAN>Thread Count 服务器初始创建的执行U程的数?/SPAN>
4?/SPAN>Thread Increase 如果weblogic发出overflow的标志信息,weblogic?x)尝试增加这个数量的执行U程Q以解决处理矛盾?/SPAN>
5?/SPAN>Threads Maximum最大执行线E数
6?/SPAN>Threads Minimum最执行线E数
7?/SPAN>Thread PriorityU程优先U?/SPAN>
另外server菜单?/SPAN>?/SPAN>configuration?/SPAN>---?/SPAN>tuning子页中还有一些相关的配置Q?/SPAN>
1?SPAN style="FONT: 7pt 'Times New Roman'">
Stuck Thread Max Time 黏联U程旉Q超q这个时间没有返回的执行U程Q系l将认ؓ(f)是黏联线E?/SPAN>2?SPAN style="FONT: 7pt 'Times New Roman'">
Stuck Thread Timer Interval pȝ查黏联线E的旉间隔如果weblogic认ؓ(f)某个队列中的所有的U程全部黏联的话Q?/SPAN>weblogic会(x)增加执行U程的数量?/SPAN>
注意Q执行线E的数量一旦增加,目前weblogic不会(x)d他Q如果增加了一些线E以后再ơ出?/SPAN>overflow的警告,weblogic?x)l增加执行线E的数量Q一直到辑ֈ上限为止?/SPAN>
(? 套接字复用器的相关配|?/SPAN>
Weblogic带有两个版本的套接字复用器,U?/SPAN>java版和本地接口版(jniQ,一般来说在讉K量小的情况下Q?/SPAN>java版比jni版性能要好一些,因ؓ(f)jni?/SPAN>API调用?x)损׃部分性能Q但是访问量大的情况Q一般都?/SPAN>jni版的性能比较好,所以尽量保?/SPAN>weblogic实用本地接口版的套接字复用器?/SPAN>
相关的配|参数有两个Q在server菜单?/SPAN>?/SPAN>configuration?/SPAN>---?/SPAN>tuning子页中的W一个和W二个配|项?/SPAN>
Enable Native IO Q启用本?/SPAN>IOQ勾选这个配|以后,weblogic׃(x)启用本地接口版的套接字复用器
Socket Readers Q如果不选上一个选项Q则q个选项可用Q也是?/SPAN>java版的套接字复用器?x)被启用Qƈ且,java版的复用器会(x)从执行线E中抽出q个比例的线E用于处?/SPAN>socket的请求。(?/SPAN>java客户端访问有养IQ?/SPAN>
随着q来J2EE软gq泛地应用于各行各业Q系l调优也来引赯Y件开发者和应用服务器提供商的重视。而对于最l客h_(d)在一个高效、稳定地实现他们的业务需求已l是他们的基本要求。所以J2EE调优昑־非常重要Q而BEA WebLogic Server是业界领先的应用服务器,BEA WebLogicq_下的J2EE调优也就ؓ(f)重要,她将为我们提供普遍的J2EE调优Ҏ(gu)。最q网l、杂志上的J2EE调优文章层出不穷。本Z自己^时工作中的一些经验积累分享给大家Q抛砖引玉?A id=0 name=0>
目录
?a
W一?应用E序调优
1.1.1 通用代码调优
1.1.2 减小没有必要的操?/A>
1.1.3 使用合适的cd
1.1.4 量使用pool,buffer和cache
1.2 JDBC代码调优
1.2.1 严格资源使用
1.2.2 实用技?/A>
1.2.3 优化SQL语句
1.3 Web代码调优
1.3.1 HttpSession的?/A>
1.3.2 JSP代码调优
1.3.3 Servlet代码调优
1.4 JMS代码调优
1.4.1 注意必要的事,避免使用不必要的特征
1.4.2 消息cd的选择
1.4.3 认方式的选择和JMS事务
1.5 EJB代码调优
1.5.1 有效使用设计模式
1.5.2 使用EJB和W(xu)ebLogic的特?/A>
1.5.3 ~存资源
1.5.4 如何选择和用Entity Bean
1.5.5 其他的一些小技?/A>
W二?应用服务器调?/A>
2.1 JVM调优
2.1.1 垃圾攉和堆大小
2.1.2 jRockit调优
2.2 Server调优
2.2.1 量使用本地I/O?/A>
2.2.2 调整默认执行U程?/A>
2.2.3 调整q接参数
2.2.4 创徏新的执行队列
2.3 JDBC调优
2.3.1 调整q接池配|?/A>
2.4 WEB调优
2.4.1 调整WEB应用描述W?/A>
2.5 JMS调优
2.6 EJB调优
2.6.1 调整pool和cache
2.6.2 优化事务隔离U别和事务属?/A>
2.6.3 其他一些小技?/A>
W三?数据库调?/A>
3.1.1 Oracle性能优化
3.1.2 Oracle的其他调?/A>
W四?操作pȝ调优
4.1 操作pȝ调整
4.1.1 HP-UX
4.1.2 Solaris
4.1.3 AIX
4.1.4 Linux
4.1.5 Windows
W五?性能监控和性能分析
5.1 性能瓉
5.2 操作pȝ监控
5.3 数据库监?/A>
5.4 WebLogic监控
5.4.1 JVM监控
5.4.2 Console监控
5.4.3 实用工具分析
5.5 应用E序分析
ȝ
参考文?/A>
关于作?/A>
?a (目录)
随着q来J2EE软gq泛地应用于各行各业Q系l调优也来引赯Y件开发者和应用服务器提供商的重视。而对于最l客h_(d)在一个高效、稳定地实现他们的业务需求已l是他们的基本要求。所以J2EE调优昑־非常重要Q而BEA WebLogic Server是业界领先的应用服务器,BEA WebLogicq_下的J2EE调优也就ؓ(f)重要,她将为我们提供普遍的J2EE调优Ҏ(gu)。最q网l、杂志上的J2EE调优文章层出不穷。本Z自己^时工作中的一些经验积累分享给大家Q抛砖引玉?BR>
本文从J2EE应用架构Q下图)来分别剖析系l调优,首先我们一般会(x)从应用程序出发,d总码,做到代码U的优化Q然后再调整应用服务?BEA WebLogic8.1)和数据库 (Oracle9i)的参敎ͼ最后当然是调整操作pȝ和网l的性能(包括g升)。诚?在我遇到的很多项目中,都是出现了性能问题后才惛_调优,而且一般都是先q行pȝ参数调整,实在解决不了才会(x)对代码进行检?实际?我们应当代码的调优放在应用设计时来做,试生时修改代码将是一件极其痛苦的事情?/P>
WebLogicq_J2EE应用架构
W一?应用E序?/B>?A id=1_1_1 name=1_1_1>(目录)
1.1.1 通用代码调优
1.1.2 减小没有必要的操?/B>
对象的创建是个很昂贵的工?所以我们应当尽量减对象的创徏,在需要的时候声明它,?始化?不要重复初始化一个对?量能做到再使用,而用完后|null有利于垃圾收集。让cd现Cloneable接口,同时采用工厂模式,减类的创?每次都是通过clone()Ҏ(gu)来获得对象。另外用接口也能减类的创建。对于成员变量的初始化也应尽量避? 特别是在一个类z另一个类时?BR>
异常抛出Ҏ(gu)能不利。抛出异帔R先要创徏一个新的对象。Throwable接口的构造函数调用名? fillInStackTrace()的本圎ͼNativeQ方法,fillInStackTrace()Ҏ(gu)查堆栈,攉调用跟踪信息。只要有异常被抛出,VM必调整调用堆栈,因ؓ(f)在处理过E中创徏了一个新的对象?异常只能用于错误处理Q不应该用来控制E序程?BR>
此外, 关闭Debug输出,量用串行化、同步操作和耗时昂贵的服?如Date())?A id=1_1_3 name=1_1_3>
1.1.3 使用合适的cd
当原始类型不能满x们要求时,使用复杂cd。String和StringBuffer的区别自不必说了,是我们用最多的cd,在涉?qing)到字符q算?强烈使用StringBuffer。在做String匚w时用intern()代替equal()?BR>
带有final修饰W的cL不可z? 如果指定一个类为finalQ则该类所有的Ҏ(gu)都是final?BR>
Java~译器会(x)LZ(x)内联所有的finalҎ(gu),q将能够使性能q_提高50%。类的属性和方式使用final或者static修饰W也是有好处的?BR>
调用Ҏ(gu)时传递的参数以及(qing)在调用中创徏的(f)时变量都保存在栈QStackQ中Q速度较快。所以尽量用局部变量?BR>
ArrayList和Vector,HashMap和Hashtable是我们经常用到的c?前者不支持同步,后者支持同?前者性能更好,大多数情况下选择前者?A id=1_1_4 name=1_1_4>
1.1.4 量使用pool,buffer和cache
使用pool、buffer和cache能大大提高系l的性能,q在J2EE的大部分技术中都是适用的?BR>
在WebLogic中就大量使用了池:JDBC Connection Pool、Socket Pool、Object Pool和Thread Pool。I/O操作?buffer是必ȝ,特别是对大文件的操作,不然Ҏ(gu)造成内存溢出。字节操作最?所以尽可能采用write(byte[])QBuffered FileOutputStream比Buffered FileWriter要快,因ؓ(f)FileWriter需要Unicode到Byte的{换?BR>
而后面讲到的JDBC、JSP、EJB和JMS我们都非常徏议用buffer和cache。ؓ(f)HttpServletResponse讄buffersize,使用wl-cache,~存在JNDI?wi)上获取的对象等{?BR>
此外,使用JDK 1.4的非dI/OҎ(gu)能也有很大提高?
1.2 JDBC代码调优
1.2.1 严格资源使用
JDBC代码调优最大的原则是使用WebLogic的连接池,而不是自qq数据库。在我接触的很多自己实现q接池的目?大部分遇到死锁和q接泄漏的问题,最后得不得修改代码。而W(xu)ebLogic提供了功能强大,性能良好的数据库q接池,我们要做的只是封装一个连接管理类Q从JNDI?wi)上获取数据源ƈ~存Q得到连接,q提供一pd关闭数据库资源的Ҏ(gu)?BR>
对Q何资源用的原则是用完即养I不管是数据库资源、上下文环境Q还是文件。数据库资源的泄漏极易造成内存泄漏Q乃至系l崩溃。在使用完数据库资源后依ơ关闭ResultSetQStatement和ConnectionQ而在一个数据库q接多次q行数据库操作时要特别注意ResultSet和Statement依次关闭?BR>
try{
//open connection
pstmt =conn.prepareStatement(strSql1);
pstmt.executeUpdate();
pstmt.close();
pstmt =conn.prepareStatement(strSql2);
rs=pstmt.executeQuery();
while (rs.next()){
//process
}
rs.close();
pstmt.close();
}catch(Exception e){
//close rs,psmt,con
}finally{
//close rs,psmt,con
}
1.2.2 实用技?/B>
在JDBC操作中还有一些小的技巧跟大家分nQ由于获取连接时默认自动提交方式Q用connection.setAutoCommit(false)关闭自动提交Q用PreparedStatement,扚w更新,业务复杂或者大数据量操作时使用存储q程Q尽量用RowSetQ此外设|记录集d~存FetchSize和设|记录集d方向FetchDirectionҎ(gu)能也有一定的提高?A id=1_2_3 name=1_2_3>
1.2.3 优化SQL语句
SQL语句的优化牵涉到很多数据库的知识Q需要与索引配合Q因此需要DBA对代码中的SQLq行查测试。常见的Qselect *不提倡用,效率极差Q徏议显式获取列Q即使是所有字D也应罗列,而取L时用count(*),为提高cache的命中率Q尽量做到SQL重用。对于大数据量的查询Q可以充分利用Oracle数据库的Ҏ(gu),每次取出m-n行的数据Q实现分|询。另外,提高性能的好选择可能是把所有的字符数据都保存ؓ(f)UnicodeQJava以Unicode形式处理所有数据,因此Q数据库驱动E序不必再执行{换过E?A id=1_3 name=1_3>
1.3 Web代码调优
1.3.1 HttpSession的?/B>
应用服务器保存很多会(x)话时Q容易造成内存不Q所以尽量减session的用,攄session
里的对象不应该是大对象,最好是单小对象Q实C行化接口。当?x)话不再需要时Q应当及(qing)时调用invalidate()Ҏ(gu)清除?x)话。而当某个变量不需要时Q及(qing)时调用removeAttribute()Ҏ(gu)清除变量。请勿将EJB对象攄在session中?A id=1_3_2 name=1_3_2>
1.3.2 JSP代码调优
目前Q在JSP面中引入外部资源的Ҏ(gu)主要有两U:(x)include指o(h)Q以?qing)include动作?include指o(h)Q例?lt;%@ include file="copyright.html" %>Q该指o(h)在编译时引入指定的资源。在~译之前Q带有include指o(h)的页面和指定的资源被合ƈ成一个文件。被引用的外部资源在~译时就定Q比q行时才定资源更高效?BR>include动作Q例?lt;jsp:include page="copyright.jsp" />。该动作引入指定面执行后生成的l果。由于它在运行时完成Q因此对输出l果的控制更加灵zR但是,只有当被引用的内定wJ地改变Ӟ或者在对主面的请求没有出C前,被引用的面无法定Ӟ使用include动作才合?
对于那些无需跟踪?x)话状态的jspQ关闭自动创建的?x)话可以节省一些资源。用如下page指o(h)Q?<%@ page session="false"%> ;量不要JSP面定义为单U程Q应讄?lt;%@page isThreadSafe=”true?>;在JSP面最好用输出缓存功能,? <%@page buffer="32kb"%>;量用wl:cache定制标记来缓存静态或相对静态的内容Q缓存jsp:include操作的结果能显著提高应用E序的运行性能?A id=1_3_3 name=1_3_3>
1.3.3 Servlet代码调优
Servlet代码调优比较单:(x)在Servlet之间跌{Ӟforward比sendRedirect更有效;讄HttpServletResponse ~冲区,如:(x)response.setBufferSize(20000);在init()Ҏ(gu)里缓存静态数据,而在destroy()中释攑֮Q徏议在Servlet里用ServletOutputStream输出囄{对象;避免在Servlet和Jsp中定界事务等?A id=1_4 name=1_4>
1.4 JMS代码调优
1.4.1 注意必要的事,避免使用不必要的特征
JMS提供了强有力的消息处理机Ӟ但是Z最大限度的提高JMSpȝ的性能Q应避免使用不需要用的特征Q同时也要注意必要的事项。比如:(x)量使用接收E序能直接用的最单、最的消息cdQ消息选择器要可能简?最好不使用)Q尽量不要用复杂的操作W,如like、in或者between{?使用字符串数据类型的速度最?务必为特定的应用E序定义特定的JMSq接工厂Qƈ且禁用默认的JMSq接工厂Q不要在javax.*与weblogic.*的名字空间中使用JNDI名称Q尽量用异步消费者,U程不必锁以等待消息的到达;使用完JNDI?wi)上的资源后注意关闭?A id=1_4_2 name=1_4_2>
1.4.2 消息cd的选择
标准JMS提供了五U消息类型,而TextMessage应用最为普? 当发送的消息是几U原始数据类型的集合体时Q最好用MapMessage消息cdQ而不要用ObjectMessageQ以便减不同系l间的耦合。此外消息是否用压~要慎重考虑Q压~未必能减少消息大小。如果生产者、消费者和目的地ƈ|在同一WebLogic Server内部Q通常不用压~。WebLogicҎ(gu)的XMLMessage能ؓ(f)q行于消息主体之上的消息选择器提供内嵌式支持Q而且易于数据交换。因此,应用E序之间传送消息用XML消息格式Q而应用程序内部间传送消息用二q制消息格式?A id=1_4_3 name=1_4_3>
1.4.3 认方式的选择和JMS事务
使用事务性会(x)话时,量使用恰当的消息确认方?如果需求允?使用NO_ACKKNOWLEDGE;非持久的订阅者用DUPS_OK_ACKNOWLEDGE或者MULTICAST_NO_ACKNOWLEDGE。而用JTA的UserTransactionQ确认方式将被忽略。在使用JMS事务Ӟ无效的消息会(x)D事务的回滚,以致消息重发q样的死循环。此Ӟ可以无效消息发送到错误消息队列Qƈ提交JMS事务Q这确保消息不?x)再ơ传递?A id=1_5 name=1_5>
1.5 EJB代码调优
1.5.1 有效使用设计模式
GoF 的《设计模式》ؓ(f)我们实现高性能、易扩展的J2EE应用提供理论保障和技术支持。而EJB作ؓ(f)J2EE的核心组件和技术,善用设计模式对系l性能影响很大。Service Locator 和Value Object 已ؓ(f)我们所熟?zhn)QFloyd Marinescu的《EJB Design Patterns》中的Session Fa?ade、Message Fa?ade、EJB Command和Data Transfer Object{设计模式更是ؓ(f)我们提供设计典范Q缓存对EJBHome的访问;使用门面模式Q不暴露Entity BeanQ用Session Bean装Entity BeanQ如果可以异步处理,则用MDB代替Session BeanQ封装业务逻辑在轻量JavaBean中;使用值对象等单对象传递数?不直接用get/setҎ(gu)操作Entity Bean。当然过度用模式或者牵强套用模式也是不提倡的Qȝ原则是减少|络量Q改q事务管理?A id=1_5_2 name=1_5_2>
1.5.2 使用EJB和W(xu)ebLogic的特?/B>
使用EJB和W(xu)ebLogic的新Ҏ(gu)往往能提高性能。与EJB2.0Ҏ(gu)相关的技巧有Q一个Application中用本地接口,对于Entity Bean肯定使用本地接口Q避免远E调用的开销Q用CMP理关系Q而不是BMPQEJB2.0中CMP的性能大大改善Q性能和移植性都优于BMPQ用ejbSelectq行内部查询Q用homeҎ(gu)q行外部查询和批处理; 数据库驱动联删除等?BR>
与WebLogicҎ(gu)相关的技巧有:使用自动生成主键,WebLogic为Oracle和Sqlserver两种数据库的CMP提供了自动生成主键功?节约了Entity Bean产生主键的时?同时设key-cache-size不小?00;WebLogic理事务性能更好,使用容器理,而不是Bean理事务;WebLogic提供了ؓ(f)CMP动态查询和扚w插入功能,Ҏ(gu)能也有很大帮助?A id=1_5_3 name=1_5_3>
1.5.3 ~存资源
对SLSB或者MDB来说,使用setMesssageDrivenContext()或者ejbCreate()Ҏ(gu)~存特定资源,在ejbRemove()Ҏ(gu)里释? 对SLSB或者MDB来说,使用setSessionContext()或者ejbCreate()Ҏ(gu)~存特定资源,在ejbRemove()Ҏ(gu)里释?对Entity Bean来说,使用setEntityContext ()Ҏ(gu)~存特定资源,在unSetEntityContext ()Ҏ(gu)里释放?BR>
1.5.4 如何选择和用Entity Bean
1. 在设计EJBӞ要适当考虑EJB的粒? l粒度的EJB在事务管理和资源理的开销太大,量创徏_粒度的 EJB , 不要太粗Q粗到能满实际需求就可以;
2. Entity Bean不是唯一方式,如果只有一个很的数据子集被经常改变,采用JDO;
3. 在操作大数据量的时?直接采用JDBC比Entity Bean更有?
4. 避免采用q回很大数据l的finderҎ(gu),?FindAll() Ҏ(gu)Q因为它的实C价太?
5. 考虑讄域组field groups,减少没有必要q昂늚属性加?如BLOB;
6. 对于EJB1.1或者BMP,可以讄is-modified-method-name属?Ҏ(gu)isModified()的值来判断是否调用ejbStore(){方?减少没有必要q算;
7. 避免q接多个表创建BMP,可以使用视图,存储q程或者O/R Mapping{方式?A id=1_5_5 name=1_5_5>
1.5.5 其他的一些小技?/B>
1. 考虑使用 javax.ejb.SessionSynchronization 接口,提供在Rollback之后恢复数据的方? afterBegin(), beforeCompletion(), afterCompletion();
2. 使用完SFSB之后Q调用remove()Ҏ(gu)释放实例;
3. 假如你不需要EJB服务的时?使用普通Javac?
4. 避免EJB之间怺调用;
5. 使用多读模式?A id=2 name=2>
W二?应用服务器调?A id=2_1 name=2_1>(目录)
2.1 JVM调优
2.1.1 垃圾攉和堆大小
垃圾攉(GC)是指JVM释放Java堆中不再使用的对象所占用的内存的q程,而Java?Heap)是指Java应用E序对象生存的空间。堆大小军_了GC的频度和旉。堆大,GC频度?速度慢。堆小,GC频度?速度快。所以GC和堆大小是一l矛盾。ؓ(f)了获取理想的Heap堆大?需要?verbosegc参数(Sun jdk: -Xloggc:<file>)以打开详细的GC输出。分析GC的频度和旉,l合应用最大负载所需内存情况,得出堆的大小?BR>通常情况?我们使用可用内存(除操作系l和其他应用E序占用之外的内?70-80%,为避免堆大小调整引v的开销,讄内存堆的最值等于最大值即:-Xms=-Xmx。而ؓ(f)了防止内存溢?在生产环境堆大小臛_?56M(Platform臛_512M),实际环境?12M~1G左右性能最?2G以上是不可取?在调整内存时可能需要调整核心参数进E的允许最大内存数。对于sun和hp的jvm,怹域太?默认4M)也可能造成内存溢出,应增加参-XX:MaxPermSize=128m。徏议设|(f)时域-Xmn的大ؓ(f)-Xmx?/4~1/3, SurvivorRatio??BR>
Z获得更好的性能,在启动文件设|WebLogicZ品模?此时sun和hp jvm JIT引擎?server,默认情况下打开JIT~译模式Ҏ(gu)能也有帮助。调整Chunk Size和Chunk Pool Size也可能对pȝ的吞吐量有提高。此外还需关闭昄GC: -XX:+DisableExplicitGC?BR>
当然在Intelq_上用jRockitQ用参?jrockitQ无疑大大提高WebLogic性能?BR>
2.1.2 jRockit调优
jRockit支持四种垃圾攉器:(x)分代复制攉器、单I间q发攉器、分代ƈ发收集器和ƈ行收集器。默认状态下QJRockit使用分代q发攉器。要改变攉器,可?Xgc:<gc-name>,对应四个攉器分其他为gencopy, singlecom, gencon以及(qing)parallel。ؓ(f)得到更好的响应性能Q应该用ƈ发垃圑֛收器Q?Xgc:genconQ可使用-Xms?Xmx讄堆栈的初始大和最大?要设|护理域-Xns?Xmx?0%。而如果要得到更好的性能Q应该选用q行垃圾回收?-Xgc: parallelQ由于ƈ行垃圑֛收器不用nurseryQ不必设|?Xns?BR>
如果你的U程大于100或者在linuxq_下,可以试使用瘦线E模式:(x)-Xthinthread,同时关闭Native IO:-Xallocationtype:global?BR>
jRockit q提供了强大的图形化监控工具Jrockit Management Console。欲详细了解JRockit可访问:(x)http://edocs.bea.com/wljrockit/docs81/index.html?/P>
2.2 Server调优
WebLogic Server的核心组件由监听U程,套接字复用器和可执行U程的执行队列组成。当服务器由监听U程接收到连接请求后,对它的q接控制权交l等待接收请求的套接字复用器。然后套接字复用器读取离开套接字的h,q将此请求及(qing)相关安全信息或事务处理环境一L(fng)入适当的执行队列中(一般ؓ(f)默认的执行队??当有一个请求出现在执行队列中时Q就?x)有一个空闲的执行U程从该队列中取走发来的?A id=2_2_1 name=2_2_1>hQƈq回应答Q然后等待下一ơ请求。因此要提高WebLogic的性能,必M调整核心lg性能出发?BR>
2.2.1 量使用本地I/O?/B>
WebLogic Server有两套套接字复用器:(x)Java版和本地库。采用小型本地库更有?量ȀzEnable Native IO(默认),此时UNIX默认使用CPUs+1个线E?Window下ؓ(f)双倍CPU。如果系l不能加载本地库,会(x)抛出java.lang.UnsatisfiedLinkException,此时只能使用Java套接字复用器,可以调整socket readers 癑ֈ?默认?3%。该参数可以在Console Server Tuning Configuration配置栏里讄?A id=2_2_2 name=2_2_2>
2.2.2 调整默认执行U程?/B>
理想的默认执行线E数是由多方面的因素军_?比如机器CPU性能、ȝ体系架构、I/O、操作系l的q程调度机制、JVM的线E调度机制。WebLogic生环境下默认的U程?5?随着CPU个数的增?WebLogic可以q乎U性地提高U程数。线E数多Q花费在U程切换的时间也p?U程数越?CPU可能无法得到充分利用。ؓ(f)获取一个理想的U程?需要经q反复的试。在试?可以?5*CPUs为基准进行调整。当I闲U程较少,CPU利用率比较低?可以适当增加U程数的大小(每五个递增)。对于PC Server 和W(xu)indow 2000Q则最好每个CPU于50个线E? 以CPU利用率ؓ(f)90%左右Z。由于目前WebLogic执行U程没有~小U程数的功能,所以应参数Threads Increase讄?,同时不应改变优先U的大小?A id=2_2_3 name=2_2_3>
2.2.3 调整q接参数
WebLogic Server用Accept Backlog参数规定服务器向操作pȝh的队列大,默认gؓ(f)50。当pȝ重蝲负荷?q个值可能过?日志中报Connection Refused,D有效q接h遭到拒绝,此时可以提高Accept Backlog 25%直到q接拒绝错误消失。对于Portalcd的应?默认值往往是不够的。Login Timeout和SSL Login Timeout参数表示普通连接和SSLq接的超时时?如果客户q接被服务器中断或者SSL定w?可以试增加该倹{这些参数可以在Console Server Tuning Configration配置栏里扑ֈ?A id=2_2_4 name=2_2_4>
2.2.4 创徏新的执行队列
创徏新的执行队列有助于解x心业务优先、避免交叉阻塞、死锁和长时间处理的业务{问题。通常?x)将自己的执行队列和默认的执行队列设|不同的优先U?q里优先U不应设?或?0?定义一个新的执行队列很Ҏ(gu),利用View Excute Queue选项中的Configure a new Excute Queue链接卛_定制新的执行队列。创建新的执行队列后Q用户需要ؓ(f)应用E序的J2EElg配置分配{略Q以便它可以扑ֈ新的队列。D个例子:(x)要将servlet或jsp捆绑C个特定的执行队列Q必L换web.xml文g,wl-dispatch-policy初始化参数设|ؓ(f)自己的执行队列名?BR>
<servlet>
<servlet-name>servletname</servlet-name>
<jsp-file>/directoryname/deployment.jsp</jsp-file>
<init-param>
<param-name>wl-dispatch-policy</param-name>
<param-value>NewExecuteQueueName</param-value>
</init-param>
</servlet>
我们可以Z个jsp或者servlet乃至一个WEB应用讄自己的执行队列。同时也可以为EJB讄自己的执行队列。对于执行时间比较长的MDB,使用自己的执行队列?A id=2_3 name=2_3>
2.3 JDBC调优
2.3.1 调整q接池配|?/B>
JDBC Connection Pool的调优受制于WebLogic ServerU程数的讄和数据库q程?游标的大。通常我们在一个线E中使用一个连?所以连接数q不是越多越?为避免两边的资源消耗,讄q接池的最大值等于或者略于U程数。同时ؓ(f)了减新接的开销,最值和最大DZ致?BR>
增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮?WebLogic能够为每一个连接缓存这些对?此值默认ؓ(f)10。在保证数据库游标大够的前提?可以Ҏ(gu)需要提高Statement Cache Size。比如当你设|连接数?5,Cache Size?0?数据库可能需要打开25*10=250个游标。不q的?当遇CPreparedStatement Cache有关的应用程序错误时,你需要将Cache Size讄??BR>
管JDBC Connection Pool提供了很多高U参?在开发模式下比较有用,但大部分在生产环境下不需调整。这里徏议最好不要设|测试表, 同时Test Reserved Connections和Test Released Connections也无需勾上?当然如果你的数据库不E_,时断时箋,你就可能需要上q的参数打开?
最后提一下驱动程序类型的选择,以OracleZ,Oracle提供thin驱动和oci驱动,从性能上来?oci驱动Zthin驱动,特别是大数据量的操作。但在简单的数据库操作中,性能相差不大,随着thin驱动的不断改q?q一弱势得到I补。而thin驱动的移植性明昑ּ于oci驱动。所以在通常情况下徏议用thin驱动。而最新驱动器׃WebLogic server/bin目录下的cd可能不是最新的,请以Oracle|站为准: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html?A id=2_4 name=2_4>
2.4 WEB调优
2.4.1 调整WEB应用描述W?/B>
WEB应用除代码之外的调优比较?仅仅是对一些WEB应用描述W的调整。首先关闭Session Monitoring Enabled,仅仅在Cluster环境下设|Session复制(优先使用内存复制),在保证应用正常运行的情况?讄较短的Session时旉?同时生环境下无需查Jsp和servletQJSPPage Check Secs和Servlet Reload Check Secs均设?1,关闭JSPKeep Generated 和JSPVerboseҎ(gu)能也有帮助。此外,q可以对jspq行预编?有两U方法:(x)Ȁzprecompile选项Q用weblogic.appc事先~译Q徏议采用后者?A id=2_5 name=2_5>
2.5 JMS调优
1. 增加-Dweblogic.JMSThreadPoolSize=n(臛_?),以提高处理JMS的线E数,在jRockit上增?XXenablefatspin以减加锁冲H?
2. 采用文g存储{略,同步写{略讄为Direct-Write,同时在windowsq_上启用磁盘写入缓?
3. 使用分布式目的地?Ȁz连接工厂Load Balancing Enabled ,Server Affinity Enabled;
4. 为减服务器不必要的JMSh路由,如果多个目的C间存在事?则部|在同一JMS服务器上,量连接工厂部|到JMS服务器所在的WebLogic实例?集群环境下,则最好将q接工厂部v到集中的所有服务器?而集中每个JMS服务器和目的地成员尽量用类似的讄Q?BR> 5. 启用消息分页存储功能,以释攑ֆ?可以为JMS服务器和目的地设|? ȀzMessages Paging Enabled和Bytes Paging Enabled,同时使用限额防止服务器耗尽接收消息的所有可用内存空?
6. 在运行W(xu)ebLogic Serverq程之外的生产者务必用流控制, q增大Send Timeout;
7. JMS Server Expiration Scan Interval讑־大的|能禁止主动扫描过期消?
8. 使用FIFO或者LIFO方式处理目的地消?
9. MDB的max-beans-in-free-pool不应大于最大MDBU程?默认U程?2+1)?
2.6 EJB调优
2.6.1 调整pool和cache
initial-beans-in-free-pool定义SLSB启动时实例的个数,默认?,可以调大到正常ƈ发数的大?以减初始响应时间。max-beans-in-free-pool为最大个?默认1000对SLSB来说,在频J创建和删除实例的情况下很有帮助,一般不用调?臛_设ؓ(f)默认U程?q大Ҏ(gu)造成内存溢出。而对Entity Bean来说,׃是匿名的,所以当频繁使用finder、home和createҎ(gu)时可以调大?BR>
对SFSB来说,量max-beans-in-cache参数讄得够的大,以满Bean实例Ҏ(gu)大ƈ发用h的要求,可以避免有状态会(x)话Beanq多的钝化行为。而idle-timeout-seconds量讄?如果SFSB不用于存储Web应用?x)话状态可以设|ؓ(f)0?BR>
对于Entity Bean来说, max-beans-in-cache同样可以首先采用默认?000Q监控实例缓存和钝化的情?再做适当调整?BR>
q行{略concurrency-strategy定义了实体Bean如何理?有四U策? Exclusive、Databse、ReadOnly、Optimistic。效率依ơ提?可靠性依ơ降?量避免使用互斥{略,如果Bean无需更新操作,使用只读{略,更甚的是,如果Bean的内容不?x)改?可设|read-timeout-seconds?,乐观q行{略旉用事务间~存{略,在entity-cache描述W中cache-between-transactions元素设ؓ(f)true?A id=2_6_2 name=2_6_2>
2.6.2 优化事务隔离U别和事务属?/B>
对EJBlg来说Q有四种事务隔离水^Q?/P>
以上隔离水^依次降低,效率和性能依次提高。因?选用满在业务数据完整性要求前提下水^最低的隔离U别?BR>
对于事务属性的讄也是如此,对于删除、修改和插入操作讄为Required,而对于只L作设|ؓ(f)Supports或者NotSupports?A id=2_6_3 name=2_6_3>
2.6.3 其他一些小技?/B>
1. 利用finders-load-bean的默认值trueQ既可以避免“n+1”的查询问题Q又可以提高pȝ的性能;
2. 使用delay-updates-until-end-of-tx参数的默认值trueQ除非应用程序对某些变化有特别的要求;
3. 应用E序在每个业务方法调用后不需要进行存在性检查,check-exists-on-method讑֮为falseQ以提高E序的性能;
4. 同一应用? enable-call-by-reference讄?true;
5. reentrant讄为false,避免事先加蝲子数据?A id=3 name=3>
W三?数据库调?A id=3_1_1 name=3_1_1>(目录)
3.1.1 Oracle性能优化
Oracle9i的性能优化除了调整kernal之外是主要对Oracle启动文g的调?卌整SGA的参数。注?不同操作pȝ不同位数的机器最优的参数不是一L(fng),q里主要有windows和unix之分,32位和64位之分?BR>首先需要调大进E数和游标数,一般默认的值对实际应用来说都比较小,比如?q程数可以调?00,游标数可以调?00?BR>
其次,看一个经验公? OS 使用内存+ SGA + session*(sort_area_size + hash_area_size +2M)<0.7RAM,通常认ؓ(f)此时的SGA比较合理。这里sort_area_size?4k, hash_area_size?28k(当排序多的时候需要增大sort_area_size,按调整后的D?,session表示最大ƈ发进E数,假设100个。假?G内存的机?OS占用200M,PGA占用200M左右,那么SGA可以设ؓ(f)400-500MQ如?G内存可以1GlSGAQ?G可以5GlSGA。不q对?2位数据库来说Q通常最多只能?.7G内存?BR>
然后QSGA内参数设|的基本原则是:(x)data buffer 通常可以可能的大,shared_pool_size 要适度Qlog_buffer 通常大到几百K?M差不多。具体的Qdata buffer 1G内存可以讄500MQ?G设ؓ(f)1.2GQ?G可设?G 。shared_pool_size不易q大Q通常应该控制?00M--300M,如果使用了大量的存储q程Q可以根据SGA的值增大到500MQ如果增大后命中率得不到提高Q则增加是无益的。具体的Q?G内存可以讄100MQ?G设ؓ(f)150MQ?G可设?00M。如不用JavaQjava_pool_size 10-20M卛_。large_pool_size如果不设|MTSQ在20M -30M 卛_Q假如设|?MTS,可以考虑?session * (sort_area_size + 2M)?BR>
最后,关于内存的设|可Ҏ(gu)statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch {view信息来考虑微调?A id=3_1_2 name=3_1_2>
3.1.2 Oracle的其他调?/B>
ZOracle高效率的q行Q除了上面提到的内存因素之外Q还有就是需要良好的数据库设计:(x)表、视图、烦引和日志的合理规划和建立。I/O的性能也是重要因素Q应量减少交换和分配。此外,是改善查点的效率?A id=4 name=4>
W四?操作pȝ调优(目录)
4.1 操作pȝ调整
操作pȝ影响应用E序q行性能的因素主要有Q硬件的配置(CPU、内存、硬盘等),核心参数,TCP/IP参数以及(qing)补丁的情늭。这里对操作pȝ的优?除了更新最新的补丁E序以保证应用程序正常运行之?是调整TCP/IP参数,文g描述W?对于个别操作pȝq有其他特别的参数调整。下面将依次介绍不同操作pȝ的情?更多的信息请参考各操作pȝ的文档?A id=4_1_1 name=4_1_1>
4.1.1 HP-UX
对于HP-UX,你首先需要安装Java Patch:
http://www.hp.com/products1/unix/java/patches/index.html,然后需要确认下面文档中的核心参数是否满?可以使用sam命o(h)修改核心参数):http://e-docs.bea.com/platform/suppconfigs/configs81/hpux11_risc/81sp3.html#80105?BR>
调整TCP参数: ndd -set /dev/tcp tcp_conn_req_max 1024, 侦听队列的最大允?dng)R度调整到1024?有时操作pȝ限制q程使用的最大内存数于你要配置的内存大?则需要调整该倹{?BR>
读者可以从http://docs.hp.com/hpux/onlinedocs/TKP-90203/TKP-90203.html了解更多的HP-UX调整?A id=4_1_2 name=4_1_2>
4.1.2 Solaris
调整TCP的参?{待旉间隔tcp-time-wait-interval讄?0000ms: /usr/sbin/ndd ?set /dev/tcp tcp_time_wait_interval 60000;
其他参数调整如下:
tcp_xmit_hiwat/tcp_recv_hiwat 131072
tcp_conn_req_max_q/tcp_conn_req_max_q0 16384
调整一个进E打开的文件描q符的数?软限制和限制以?qing)散列表的大?修改/etc/system文g:
set tcp:tcp_conn_hash_size=32768
set rlim_fd_cur=8192
set rlim_fd_max=8192
更多的调整信息请查阅: http://docs.sun.com/db/doc/806-7009(Solaris9)?A id=4_1_3 name=4_1_3>
4.1.3 AIX
AIX用no命o(h)调整TCP参数Q等待时间间隔tcp_timewait: no -o tcp_timewait=4,tcp.timewait参数讄??5U间隔,?分钟。运行no -a命o(h)显C网l当前的所有属性倹{由于UDP_SENDSPACE默认的缓存大是8k,为减I/O异常,需调整?2k:
no -o udp_sendspace=32768。此? 当WebLogic HTTPh忙时,可以调整侦听队列的最大长somaxconn?192(默认值是1024)?BR>
更多信息:http://publib16.boulder.ibmo.com/pseries/en-us/aixbman/prftungd/prftungd.htm?A id=4_1_4 name=4_1_4>
4.1.4 Linux
调整Linuxpȝ使用sysctl命o(h)修改TCP参数{待旉间隔:sysctl -w ip_ct_tcp_timeout_time_wait=60;调整打开文g的最大数:?etc/sysctl.conf文g中,d: Fs.file-max=65535,然后q行sysctl -p;调整打开文g描述W最大数?192:?etc/security/limits.conf文gQ添?WebLogic hard nofile 8192(仅针对WebLogic用户),然后在WebLogic启动文g里运行ulimit-n 8192Ȁz设|?BR>
更多信息h?http://ipsysctl-tutorial.frozentux.net/ipsysctl-tutorial.html?A id=4_1_5 name=4_1_5>
4.1.5 Windows
Windowspȝ的调整通过修改注册表HKEY-LOCAL-MACHINESYSTEMCurrent ControlSetServices文gҎ(gu)完成。可以调整TcpipParameters子文件夹中的{待旉间隔旉TcpTimedWaitDelay参数的倹{侦听队列最大长度的默认gؓ(f)15Qؓ(f)修改它,可在InetinfoParameters子目录中创徏DWORD条目ListenBackLog?BR>此外,Windows2000的Service Pack(要求sp3以上)也会(x)影响pȝE_? http://e-docs.bea.com/platform/suppconfigs/configs81/win2ksvr_as_data_pentium/81sp3.html?A id=5 name=5>
W五?性能监控和性能分析(目录)
5.1 性能瓉
最?介绍一下实际分析J2EE应用性能的常用命令和工具。对于实C个高性能的J2EE应用来说,掌握了J2EE调优的理论经验还是不够的。掌握性能监控,发现瓉和问题诊断才是保证J2EEpȝ持箋高效q行的关键?BR>瓉指的是限值所有吞吐操作以?qing)严重媄响反应时间的pȝ内资源。在分布式系l内Lq纠正瓶颈是非常困难的,需要有l验的团队来解决。瓶颈会(x)发生在Web服务器上Q程序代码中Q应用服务器上,数据库,操作pȝ或者网l,g上。经验表明,瓉很容易发生在如下地方Q数据库q接与队列中Q应用服务器的程序代码中Q应用服务器和W(xu)eb服务器硬件上Q网l和TCP配置中。实际中可以着力对q些环节q行监控?BR>
5.2 操作pȝ监控
操作pȝ层面的性能监控主要是对内存、CPU、I/O和交换区的用情况进行监控分析。windowsq_可以通过d理器和perfmon工具查看。如果是unixpȝ可以使用statpd命o(h)(vmstat, mpstat, iostat)监控内存、CPU和I/O的即时变?使用swap命o(h)查看交换区的使用情况。如果操作系l安装了top、topas、glance{用工?则用top、topas、glance能更ؓ(f)方便地看到WebLogicq程Ҏ(gu)作系l的内存,CPU和I/O资源使用的即时变化情c(din)?BR>
而网l方面的性能可以通过ping和netstat{命令来监控,主要几个关键的网l统计?如数据包再发送、重复数据包和数据包侦听丢失?BR>
说明:本文提到的unix命o(h)q适用所有操作系l?仅供参考?A id=5_3 name=5_3>
5.3 数据库监?/B>
数据库层面的监控q里为oracle9iZ来说?可以采用oracle自带的工具Oracle
Interprise Manager Console来监控session和sql的执行情c(din)还有其他专业的数据库监控工具可以?比如QUEST的spotlight(http://www.quest.com/spotlight-portal/)可以非常形象和直观地对Oracle数据库的CPU、内存、I/O、Data Buffer Size、Shared Pool Size、Redo Buffer{参数进行即时监?q自动对不正常的参数以红色显C?A id=5_4 name=5_4>
5.4 WebLogic监控
5.4.1 JVM监控
采用java参数-verbose:gc 来分析JVM的GC非常J琐Q而且不直观。?Xloggc:gc.log 参数GC日志写入文g,采用GC 工具HPjtune (http://www.javaperformancetuning.com/tools/hpjtune/index.shtml)q行分析,可以L看出当前jvm参数配置是否合理?BR>
严格意义上来说HPjtune是一个分析工?不是监控工具。这里不得不提及(qing)jRocket,Intelq_上最快的JVM, 在WebLogic启动命o(h)中增?Xmanagement参数,可以执行beajrockit81sp3_142_04in下console命o(h)监控WebLogic的内存用和CPU负蝲情况。设|Tools/Preferences菜单中的Mode of operation属性ؓ(f)developer, jRocket提供Method Profiler工具Q她能够所有在JRockit Java虚拟Z执行的成员方法的调用ơ数、执行的L间和每次调用的执行时间都l计出来Q进行代码调优Q这是jRockit的又一大优ѝ?/P>
5.4.2 Console监控
WebLogic Console除了理配置功能之外,提供了丰富的监控功能。通过WebLogic ConsoleQ首先我们可以查看服务器的运行情c(din)?A id=5_4_2_1 name=5_4_2_1>
5.4.2.1 Server监控
通过使用服务器的Performance Monitoring选项卡,可以查看到请求吞吐量Q执行队列积压情况以?qing)JVM栈利用情c(din)而通过点击Performance Genaral选项卡中?Monitor all Active Queues...”可以查看所以执行线E的当前l计数据。此外Monitoring选项卡还可以监控JTA和JMS{Service的情c(din)?/P>
5.4.2.2 JDBC监控
在连接池Monitoring选项卡中QW(xu)ebLogic Console为每一个数据库q接池提供了实时l计信息。其中有三个重要参数可以反应WebLogic Server的健L(fng)况:(x)Connections High、Wait Second High和W(xu)aiters High。Connection High表示从服务器启动开始后到达池的最大连接数量,如果大于池的最大数量,则需要调整Maxium Capacity。Waiters High表示在没有可用连接的情况下,应用E序{待q接的最大个数。我们可以根据Waiters High的大调整连接池定w。更多的参数可以通过Customize this view链接d,参数含义参?http://e-docs.bea.com/wls/docs81/ConsoleHelp/domain_jdbcconnectionpool_monitor.html#1104829?A id=5_4_2_3 name=5_4_2_3>
5.4.2.3 WEB监控
Web Application Monitoring选项卡可以监控WEB应用的Session个数,以及(qing)Servlet的响应情?ȀzSession Monitoring Enabled可以获取所有session的统计情c(din)更多信息请参?
http://e-docs.bea.com/wls/docs81/ConsoleHelp/web_applications.html#1106723?A id=5_4_2_4 name=5_4_2_4>
5.4.2.4 JMS监控
Welogic Console JMS监控功能比较?不仅在Server JMS Monitoring选项卡可以监控Active JMS Connections, Pooled JMS Connections和Active JMS Servers的连接和使用情况。还可以监控JMS Session Pool、Active JMS Destinations和Durable Subscribers的消费和生情况。比?我们可以监控到JMS Queue的接收和消费消息的数量和字节数。有关JMS监控的详l情况可参见:http://edocs.bea.com/wls/docs81/ConsoleHelp/jms_monitor.html?BR>
5.4.2.5 EJB监控
EJB监控包括对SLSB,SFSB,Entity Bean,MDB四种EJB的监控。本为EJB监控提供了非怸富的q行时统计信?http://e-docs.bea.com/wls/docs81/ConsoleHelp/ejb.html#1105036),非常有利于我们对EJBq行性能调优?BR>
SLSB选项卡ؓ(f)用户提供实例池的q行时统计信息。Pool Miss Ratio 表示实例池的Miss?Pool Waiter Total Count 表示U程{待bean 实例的篏计时?Pool Timeout Total Count表示时的线E数。当P(yng)ool Miss Ratio较大?可以增加max-beans-free-pool?BR>
SFSB可以xCache Miss Ratio和Activation Count。Cache Miss Ratioq大?调大max-bean-in-cache未必有帮?需要尝试不用的max-bean-in-cache以获得最低的Cache Miss Ratio。激zd严重减慢应用E序的速度,如果某一个bean的Activation Count的D高,那么需要考虑增加max-bean-in-cache的大?BR>Entity Beanl合了SLSB的free pool和SFSB的cache。可以结合上面的{略q行监控?
而MDB仅比SLSB多一个参数JMSConnection Alive,报告EJB是否成功q接到JMS目的地?BR>
更多Console监控信息可参?A target=_blank>http://edocs.bea.com/wls/docs81/ConsoleHelp/index.html?A id=5_4_3 name=5_4_3>
5.4.3 实用工具分析
WebLogic除了提供Consoleq行应用监控之外,用户q可以编写JMXE序或者通过SNMP协议q行监控。而QUEST Spotlight for WebLogic Server提供了类似WebLogic ConsolecM的监控功?q对异常情况昄?BR>q里不得不提到实战中l常用来分析性能瓉的工具THREAD DUMP,l一的命令是使用 weblogic.Admin 命o(h) THREAD_DUMP。而在 windows上还可以使用<Ctrl>+<Break> 来创断问题所需的线E{储Thread Dump,而在unix上用kill -3 <wlspid>命o(h)。我们从中可以看到WebLogic后台U程的运行情?通常需要每?0U左xl执行几ơ以助诊断问题。更多信息可以参考BEA实战集锦?A id=5_5 name=5_5>
5.5 应用E序分析
应用E序分析除了凭借程序员丰富的经验和敏锐的洞察力Mh工检查代码之?使用厂家的工具也是节省时间的不错选择。目前市Z有Borland Optimizeit Enterprise Suite和QUEST Jprobe两个产品可以用来分析性能瓉,垃圾攉,内存泄漏,U程死锁和代码复盖等。Hpjmeter是一个免费的工具,也具有以上类似的性能分析功能?BR>
而Borland Optimizeit Server Trace,HP OpenView Transaction Analyzer和Mercury LoadRunner J2EE breakdown都可以用来分解J2EE应用从客L(fng)讉K到最l数据库操作每一层次p的时?甚至_到每一个方法的执行旉。Server Traceq具有检查内存泄漏,q接泄漏和错误警告等功能,一般在试环境中用。而HP OTVA的优势在于运行时监控,LoadRunner优势在于压力试?A id=6 name=6>
ȝ(目录)
J2EE调优是一门实践和l验U学Q是一个复杂而往复的q程。其原则是:(x)合理。合?看似?l细品味,意味深长。本文所q的调优{略q不是一成不变的Q只是ؓ(f)了给大家一个参考徏议,让大家少走弯路,关键是根据实际环境调优。欢q有兴趣的朋友在论坛上积极讨论和批评指正?A id=7 name=7>
参考文?/B>(目录)
[1]BEA WebLogic Server edocs: http://e-docs.bea.com/wls/docs81/perform/index.html
[2]Gregory Nyberg & Robert Patrick :Mastering BEA WebLogic Server
[3]Jack Shirasi:Java Performance Tuning
关于作?/B>(目录)
周v?dev2dev ID:zhouhg) 合力思Y?中国)有限公司技术顾问,BEA Certified SpecialistQBEA dev2dev撰稿人。多q从事J2EE开发工作,目前致力于技术支持工作,主要研究J2EE技术在WebLogic上的应用、调优。有着西电(sh)人的务实Q喜Ƣ专研技术,是个体育狂热者?BR>联系方式: 010-85251858-1053,zhouhaigen@hotmail.com