??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 查启动Eclipse的JVM讄?在Help\About Eclipse SDK\Configuration Detail里面Q你可以看到启动Eclipse的JVM?q个JVM和你在Eclipse中设|的Installed JDK是两回事情?如果启动Eclipse的JVMq是JDK 1.4的话Q那最好改为JDK 5Q因为JDK 5的性能?.4更好?/p>
C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe"
2. 查Eclipse所使用的heap的大?在C:\eclipse目录下有一个配|文件eclipse.iniQ其中配|了Eclipse启动的默认heap大小
-vmargs
-Xms40M
-Xmx256M
所以你可以把默认值改?
-vmargs
-Xms256M
-Xmx512M
当然Q也可以q样做,把堆的大改?56 - 512?/p>
C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe" -vmargs -Xms256M -Xmx512M
3. 其他的启动参数?如果你有一个双核的CPUQ也许可以尝试这个参?
-XX:+UseParallelGC
让GC可以更快的执行。(只是JDK 5里对GC新增加的参数Q?/p>
Java对多U程的支持与同步机制深受大家的喜爱,g看v来用了synchronized关键字就可以L地解军_U程׃n数据同步问题。到底如何?――还得对synchronized关键字的作用q行深入了解才可定论?/span>
ȝ说来Q?/span>synchronized关键字可以作为函数的修饰W,也可作ؓ函数内的语句Q也是qx说的同步Ҏ和同步语句块。如果再l的分类Q?/span>synchronized可作用于instance变量?/span>object referenceQ对象引用)?/span>static函数?/span>class literals(cdU字面常?/span>)w上?/span>
在进一步阐qC前,我们需要明几点:
AQ无?/span>synchronized关键字加在方法上q是对象上,它取得的锁都是对象,而不是把一D代码或函数当作锁――而且同步Ҏ很可能还会被其他U程的对象访问?/span>
BQ每个对象只有一个锁Q?/span>lockQ与之相兌?/span>
CQ实现同步是要很大的pȝ开销作ؓ代h的,甚至可能造成死锁Q所以尽量避免无谓的同步控制?/span>
接着来讨?/span>synchronized用到不同地方对代码生的影响Q?/span>
假设P1?/span>P2是同一个类的不同对象,q个cM定义了以下几U情늚同步块或同步ҎQ?/span>P1?/span>P2都可以调用它们?/span>
1Q?/font> ?/span>synchronized当作函数修饰W时Q示例代码如下:
Public synchronized void methodAAA()
{
//….
}
q也是同步ҎQ那q时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也是_当一个对?/span>P1在不同的U程中执行这个同步方法时Q它们之间会形成互斥Q达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以Q意调用这个被加了synchronized关键字的Ҏ?/span>
上边的示例代码等同于如下代码Q?/font>
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
(1)处的this指的是什么呢Q它指的是调用q个Ҏ的对象,?/span>P1。可见同步方法实质是?/span>synchronized作用?/span>object reference。――那个拿CP1对象锁的U程Q才可以调用P1的同步方法,而对P2而言Q?/span>P1q个锁与它毫不相qԌE序也可能在q种情Ş下摆脱同步机制的控制Q造成数据混ؕQ(
2Q同步块Q示例代码如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
q时Q锁是soq个对象Q谁拿到q个锁谁可以运行它所控制的那D代码。当有一个明的对象作ؓ锁时Q就可以q样写程序,但当没有明确的对象作为锁Q只是想让一D代码同步时Q可以创Z个特D的instance变量Q它得是一个对象)来充当锁Q?/span>
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // Ҏ?/span>instance变量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
注:雉度的byte数组对象创徏h比M对象都经――查看编译后的字节码Q生成零长度?/span>byte[]对象只需3条操作码Q?/span>Object lock = new Object()则需?/span>7行操作码?/span>
3Q将synchronized作用?/span>static 函数Q示例代码如下:
Class Foo
{
public synchronized static void methodAAA() // 同步?/span>static 函数
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(cdU字面常?/span>)
}
}
代码中的methodBBB()Ҏ是把class literal作ؓ锁的情况Q它和同步的static函数产生的效果是一LQ取得的锁很特别Q是当前调用q个Ҏ的对象所属的c(ClassQ而不再是p?/span>Class产生的某个具体对象了Q?/span>
记得在?/span>Effective Java》一书中看到q将 Foo.class?/span> P1.getClass()用于作同步锁q不一P不能?/span>P1.getClass()来达到锁q个Class的目的?/span>P1指的是由FoocM生的对象?/span>
可以推断Q如果一个类中定义了一?/span>synchronized?/span>static函数AQ也定义了一?/span>synchronized ?/span>instance函数BQ那么这个类的同一对象Obj在多U程中分别访?/span>A?/span>B两个ҎӞ不会构成同步Q因为它们的锁都不一栗?/span>AҎ的锁?/span>Objq个对象Q?/span>B的锁?/span>Obj所属的那个Class?/span>
结如下Q?/font>
搞清?/span>synchronized锁定的是哪个对象Q就能帮助我们设计更安全的多U程E序?/span>
q有一些技巧可以让我们对共享资源的同步讉K更加安全Q?/font>
1Q?/font> 定义private ?/span>instance变量+它的 getҎQ而不要定?/span>public/protected?/span>instance变量。如果将变量定义?/span>publicQ对象在外界可以l过同步Ҏ的控制而直接取得它Qƈ改动它。这也是JavaBean的标准实现方式之一?/span>
2Q?/font> 如果instance变量是一个对象,如数l或ArrayList什么的Q那上述Ҏ仍然不安全,因ؓ当外界对象通过getҎ拿到q个instance对象的引用后Q又其指向另一个对象,那么q个private变量也就变了Q岂不是很危险?/span>q个时候就需要将getҎ也加?/span>synchronized同步Qƈ且,只返回这?/span>private对象?/span>clone()――这P调用端得到的是对象副本的引用了?/span>
U联的关闭这听v来好像很有道理,而且在很多地方这样做也是正确的,通常q样?br />Connection con = getConnection();//getConnection is your method
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
…?br />///rs.close();
///ps.close();
con.close(); // NO!
q样做的问题在于Connection是个接口Q它的close实现可能是多U多L。在普通情况下Q你?DriverManager.getConnection()得到一个Connection实例Q调用它的closeҎ会关闭Statement?ResultSet。但是在很多时候,你需要用数据库q接池,在连接池中的得到的Connection上调用closeҎ的时候,Connection可能q没有被释放Q而是回到了连接池中。它以后可能被其它代码取出来用。如果没有释放Statement和ResultSetQ那么在Connection上没有关闭的Statement和ResultSet可能会越来越多,那么…?br />相反Q我看到q这L说法Q有人把Connection关闭了,却l用ResultSetQ认h可以的,引发了激烈的讨论Q到底是怎么回事׃用我多说了吧?/p>
所以我们必d心的释放数据库资源Q下面的代码片断展示了这个过E?/p>
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getConnection();//getConnection is your method
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
///...........
}
catch (SQLException ex) {
///错误处理
}
finally{
try {
if(ps!=null)
ps.close();
}
catch (SQLException ex) {
///错误处理
}
try{
if(con!=null)
con.close();
}
catch (SQLException ex) {
///错误处理
}
}
在ArrayList 应用中有q样的代码:
ArrayList a=new ArrayList();
a.add(...);
Iterator i=a.iterator();
理解QIterator i=a.iterator();
Iterator 是一个接口,在上面a.iterator()Ҏ的作用是q回一个接?br />hasmoreQ)QnextQ)是怎么被实现的Q?br />
处理Q?br />q代模式
ArrayList内部有一个实CIterator 接口的类Qa.iterator是q回它内部类的一个实例,卌回一个实C的iterator接口的类?br />
接口是一个类型,相当于一个父cdQsupertypeQ,可以用一个接口引用一个实C此接口的cȝ实例。这样只能用接口提供的方法来讉K此对象,可以限制讉KQ隐藏具体实现?br />
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
处理Q?br />
因ؓ构造函数是U有的,用户不能自己实例对象 private Singleton(){}
而且指向q个唯一的对象的引用也是U有Q只能通过getInstanceҎq回对象的引?br />getInstanceҎ正实C保证唯一对象的功?/p>
abstract class Demo ?
abstract void method1();
abstract void method2();
?
?/p>
使用interface的方式定义Demo抽象cȝ方式如下Q?
interface Demo {
void method1();
void method2();
?
}
在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?
从编E的角度来看Qabstract class和interface都可以用来实?design by contract"的思想。但是在具体的用上面还是有一些区别的?
首先Qabstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?
其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时会造成很大的麻烦?
在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了?
同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place"原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?br />三、从设计理念层面看abstract class和interface
上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本文将从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?
前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d?is a"关系Q即父类和派生类在概忉|质上应该是相同的。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?
考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:
使用abstract class方式定义DoorQ?
abstract class Door {
abstract void open();
abstract void close()Q?
}
使用interface方式定义DoorQ?
interface Door {
void open();
void close();
}
其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?br />如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)下面罗列出可能的解x案,q从设计理念层面对这些不同的Ҏq行分析?br />解决Ҏ一Q?br />单的在Door的定义中增加一个alarmҎQ如下:
abstract class Door {
abstract void open();
abstract void close()Q?
abstract void alarm();
}
或?
interface Door {
void open();
void close();
void alarm();
}
那么h报警功能的AlarmDoor的定义方式如下:
class AlarmDoor extends Door {
void open() { ?}
void close() { ?}
void alarm() { ?}
}
或?
class AlarmDoor implements Door ?
void open() { ?}
void close() { ?}
void alarm() { ?}
?/p>
q种Ҏq反了面向对象设计中的一个核心原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方法在了一赗这样引L一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ"报警?q个概念的改变(比如Q修改alarmҎ的参敎ͼ而改变,反之依然?
解决Ҏ二:
既然open、close和alarm属于两个不同的概念,ҎISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都用abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义?
昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?
如果两个概念都用interface方式来定义,那么反映出两个问题Q?
1、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底是Doorq是报警器?
2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义?
如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关pd本质上是"is a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓQ所以报警概念可以通过interface方式定义。如下所C:
abstract class Door {
abstract void open();
abstract void close()Q?
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { ?}
void close() { ?}
void alarm() { ?}
}
q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?
abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体?br />
一、当两个q发U程讉K同一个对象object中的q个synchronized(this)同步代码块时Q一个时间内只能有一个线E得到执行。另一个线E必ȝ待当前线E执行完q个代码块以后才能执行该代码块? |
Java学习q程的一些重? 主要说说Java的几大块吧,无法说得很细Q因为其实每一块拿出来都能说很多,我就说一下这几块学习的时候的重点或者应该注意的东西? 数值类型: 虽然是面向对象的语言Q但是在使用上数值类型还是必不可的Q如果在C的学习中已经掌握了C的数D和转换规则Q那我想q里应该没有什么问题,只有两点需要注意:1?4.0q样的Q点常量被认ؓ是double型,只有加上f后缀才是float型的Q?、整数常量说h被认为是int型,但是在编译时Q可以认为编译器其看作能表C数的最数|因此byte b = 100;不会报错? 引用cdQ? 我也是从C/C++转过来的Q其实所谓引用类型在C++中已有体玎ͼ是传参的时候有一U引用类型,从C来考虑Q它是一个指针,只不q,我们不能对它q行指针上的操作。所以这里的重点是:1、Java里所有的对象都是在堆中生成的Q所以需要类似指针的东西指向它,那就是引用;2、我们通过引用操作的是引用所指向的对象,除了赋值操作外Q应该就没有什么操作是针对引用本n的了Q这一ҎC的指针与Java的引用区别所在? cd对象Q? q是一个大块,有很多东西,不展开讲了Q就说几个重点:1、类Ҏ、类属性与成员Ҏ、成员属性在加蝲、初始化、用上的异同;2、在构造函CQthis()和super()的用法;3、子cȝ加蝲q程、初始化q程和构造过E;4、方法的重蝲和覆写;5、覆写所引出的多态问题?注意Q多态之应用在方法上Q对属性没有作? 函数调用的参C递: 如果把引用类型所记录的地址|q作是引用cd变量的值的话,那么QJava的所有方法调用的时候,都是采用的g??数值类型传数|引用cd传地址? IO: 与C比v来,Java的输入输出,其是输入是非常ȝ的,也许是因为出于面向对象的考虑吧?不知道。Java提供了很多的IO,但是我们q不必将各种IO都搞清楚Q我们只需要了解字节流与字W流各有什么功能,字符是如何在字节流之上构造的Q几乎所有的字符构造的时候都是徏立在一个已有的字节的基础上的Qƈ且它的这U设计得我们可以像套管子一PIO一节一节套hQ直到得到我们想使用的IO对象(例:BufferedReader的?。在我们以后使用的时候,我们可以再去查APIQ我觉得主要要看的几个类是:FileReader、FileWriter、BufferedReaderQ再配合上System.out对象Q对于文本的输入、输出来_p够用了,至于其他的,我觉得不考试的话Q没有必要看那么多,用的时候再看了?我用Java一q半来,基本上就在用BufferedReader和System.out) 容器Q? 个h认ؓQ这是Java~程的一大利器,我最q的类是:ArrayList(List)作ؓ可变长数l、HashMap(Map)用来建立查找表,Set我很用Q只在HashMap的用中q带用过一些。通过对这两个cȝ熟悉Q能够将List、Set和Map三大cȝ基本用法掌握。另外它的几个辅助类要掌握:Iterator和Collections。CollectionscL供容器的一些通用工具Q比如排序。而说到排序,q扯出了比较器QComparator。能够熟l用Comparatorc,可以让你q需求和自己的类定制排序Ҏ? AWT和SWINGQ? 个h认ؓQJava在图形界面的制作上有着非常好的装性,我以前曾l试囑֭qMFCQMFC在生成图形界面的时候会帮助你生成一些代码,然后让你在这些代码的指定位置d代码以实现功能,我这个h有个习惯Q如果让我看C一些东西,那么我不搞清除ؓ什么这么写Q就不会往下走Q看到那许多代码Q自然就惛_清楚那些是什么,l果引出来好多知识,后来我才知道其中有些是调用WinAPIQ结果我到现在还是不会用MFC。这里ƈ不是贬低MFCQ我怿MFC有其qh之处Q只不过个h认ؓ它的装性做得不好,暴露Z太多东西Q也许能够提高灵zL,不过Q可能我跟它无缘:(。在q方面Java做得不错,l你一个类Q你用就是了Q它图形界面的低层实现隐藏的很好,其作ؓ一个对象给你,而你只需要在q个对象上修修改改,挺方便的? 作ؓ初学者,我觉得AWT的重点在于它的几个Listener的用法,q有布局格式Q然后就是那许多的Component的用处和用法?不过Q我觉得Q等到用的时候再L合适的Componentq行学习应该也不太q?^_^) 不过Q因为我个h使用的原因,所以至今AWT和SWING都用得很,所以这斚w也就不便多说了,抱歉。写q些q不是告诉大家怎么解决问题Q因为每一个都有很多可写,只是希望能给初学者一点参考,希望能够帮助初学者们有的攄地看书?/td> |
1.工作? (N) |
臛_64位双CPU
2G内存 DDR2 533
tomcat5.5默认配置
java5.0默认配置
mysql5.0默认配置
带宽?0M独n.
如何改变软g斚w的配|要求。优化方面的资料。硬件方面要升哪些Q?以达到支持大U在U用户ؓ最?000人?br />
处理Q?br /> 2000 人在U,每秒钟请求数应该在几百次或者更低些的程度,q发C会超q?00(q_10妙请求一?Q用普通的 PC 机,每秒钟也能够处理上百ơ的hQ?br /> ~存优化Q解x能问题首先惛_的就是缓存,?Web 应用中有很多~存的方式,可以~存?Web 层的 servletContext 中,也可以缓存到业务层中Q甚臛_以在数据库中建立冗余。而生成静态页面是一U极端的做法Q一般来说会增加复杂性,同时可能会对灉|性和可维护性造成很大伤害。缓存的要点在于命中率,命中率低的东西不应该~存Q除非对内存的hg做考虑。ȝh设计上就两句话,使用 N 层结构,合理~存。根据程序的需要,适当是用缓存机Ӟ
E序q行优化ҎQ比如:每次查找部分记录Q而不是全部查出来Q这h可以减轻服务器的负担Q也可以减少|络传输量; 对于pȝ中的数据库连接一定要q行妥善的处理; 寚w要用 scrchrnozied 的地方要用,但是有些地方可以不用同步化的Q这个对速度影响也很大;从代码入手,优化E序Q在数据持久化上q行改进Q采用成熟的库访问对象(Data Access ObjectQ设计模式也会节省你的服务器开销?br /> g升Q硬件方面还不行Q硬盘最好搞阵列Q还可以再来一个服务器Q弄个负载均衡,׃个服务器来处理用LhQapache必然是要用到的,他将挡在tomcat前处理httph?br /> 注意Q在g_强大的时候,?web ?db 分两台服务器来做Q只会降低效率,因ؓ|络~组的成本要比本地内存中的复刉几个数量U。同样道理,负蝲均衡也只会导致更复杂的结构,会引h多的问题Qƈ产生更低于下的效率。将一个应用分布于多台机器的唯一理由Q就是由于一台机器根本顶不住Q不得不分?br /> 环境优化Q调Tomcat、JVM的Heap大小{参数做一些优化, Tomcat的虚拟内存管理有最大值限Ӟ可以q发q行多个Tomcat来均衡负载,tomcat5.5默认配置 ==>改了JAVA_OPTS没有Q开大内?既java_opts= -Xms1024m -Xmx1024m Q?java5.0默认配置 ==>升一下到最大的版?.0 升处理
pȝ内存试Q?br /> Q?Q自己测试:参考tomcat,jvm,mysql优化斚w的资料。测试如下操作出错:
C:\>java -Xms536870932 -Xmx536870912
Error occurred during initialization of VM
Incompatible initial and maximum heap sizes specified臛_64位双CPUQ原则上面来?4位的CPU应当可以用到无限大的内存了,也还是理Z的了。可以java -Xmx2000M -versionq样一路加上去试试看你的可以加到多大?br /> Q?Q工h试: 压力试Q对应用pȝq行性能采样于监控,QWily有一套品可以在q行期进行调优,但我没有用过Q,我用的P6SpyQ加MS的那个压力测试工P也有D用LoadRunner来跑一跑,在SQL语句q个地方有太多的名堂可做了?br /> 软g斚wQ?br /> a、Y仉|?Apache2.2.0 + mod_ajp + jrockit-R26.0.0-jdk1.5.0_04+ Tomcat5.5.15 (启多?+apr1.2.2 .
b、内存徏?g以上 ?tomcat的内存参C?set JAVA_OPTS=%JAVA_OPTS%-Xms1024m -Xmx1024m (内存2g的话Q徏议set JAVA_OPTS=%JAVA_OPTS%-Xms512m -Xmx512m).
c、tomcat5.5版本的性能已经大幅度提高了?/p>