国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
J2EE程序的性能優(yōu)化技巧
 
         應(yīng)用J2EE平臺開發(fā)的系統(tǒng)的性能是系統(tǒng)使用者和開發(fā)者都關(guān)注的問題,本文從服務(wù)器端編程時應(yīng)注意的幾個方面討論代碼對性能的影響,并總結(jié)一些解決的建議。
  關(guān)鍵詞:性能,Java,J2EE,EJB,Servlet,JDBC

  一、概要

  Java 2 Platform, Enterprise Edition (J2EE)是當(dāng)前很多商業(yè)應(yīng)用系統(tǒng)使用的開發(fā)平臺,該技術(shù)提供了一個基于組件的方法來設(shè)計(jì)、開發(fā)、裝配和部署企業(yè)級應(yīng)用程序。J2EE平臺提供了一個多層結(jié)構(gòu)的分布式的應(yīng)用程序模型,可以更快地開發(fā)和發(fā)布的新的應(yīng)用解決方案。J2EE是一種技術(shù)規(guī)范,定義了整個標(biāo)準(zhǔn)的應(yīng)用開發(fā)體系結(jié)構(gòu)和一個部署環(huán)境,應(yīng)用開發(fā)者開發(fā)時只要專注于具體商業(yè)邏輯和商業(yè)業(yè)務(wù)規(guī)則的實(shí)現(xiàn)上,而其他的諸如事務(wù)、持久化、安全等系統(tǒng)開發(fā)問題可以由應(yīng)用程序容器或者服務(wù)器處理,開發(fā)完成后,就可以方便地部署到實(shí)現(xiàn)規(guī)范的應(yīng)用服務(wù)器中。
  作為網(wǎng)絡(luò)上的商業(yè)應(yīng)用系統(tǒng),同時訪問的人數(shù)是很多的,在大量訪問的情況下,過多的資源請求和有限的服務(wù)器資源(內(nèi)存、CPU時間、網(wǎng)絡(luò)帶寬等)之間就會出現(xiàn)矛盾,應(yīng)用系統(tǒng)的性能就顯得很重要了,有時正確的代碼并不能保證項(xiàng)目的成功,性能往往是最后決定一個項(xiàng)目是否成功關(guān)鍵。
  本文主要從性能的角度出發(fā),討論J2EE服務(wù)器端的代碼性能優(yōu)化和提升。

  二、常見的Java 編程

  J2EE語言基礎(chǔ)是Java,常用的Java代碼問題對應(yīng)用系統(tǒng)的性能影響,下面討論了一些應(yīng)該注意方面。
  • 使用StringBuffer代替String
  當(dāng)處理字符串的相加時,常見的寫法是:..
String str1 = "Hello";
String str2 = "welcome to world";
String str3 = str1 + ", " + str2 +"!";
System.out.println(str3);
  很多人都知道,這樣的代碼效率是很低的,因?yàn)镾tring是用來存儲字符串常量的,如果要執(zhí)行“+”的操作,系統(tǒng)會生成一些臨時的對象,并對這些對象進(jìn)行管理,造成不必要的開銷。
  如果字符串有連接的操作,替代的做法是用StringBuffer類的append方法,它的缺省構(gòu)造函數(shù)和append的實(shí)現(xiàn)是:
public StringBuffer() { // 構(gòu)造函數(shù)
this(16); // 缺省容量16}
public synchronized StringBuffer append(String str) {
 if (str == null) {
  str = String.valueOf(str);
 }
 int len =str.length();
 int newcount = count + len;
 if(newcount > value.length)
 expandCapacity(newcount);
 // 擴(kuò)充容量
 str.getChars(0, len, value, count);
 count = newcount;
 return this;
}
  當(dāng)字符串的大小超過缺省16時,代碼實(shí)現(xiàn)了容量的擴(kuò)充,為了避免對象的重新擴(kuò)展其容量,更好的寫法為:
StringBuffer buffer = new StringBuffer(30);
// 分配指定的大小。
buffer.append("hello");
buffer.append(",");
buffer.append("welcometo world!");
String str = buffer.toString();
  • 生成對象時,分配合理的空間和大小
  Java中的很多類都有它的默認(rèn)的空間分配大小,對于一些有大小的對象的初始化,應(yīng)該預(yù)計(jì)對象的大小,然后使用進(jìn)行初始化,上面的例子也說明了這個問題,StringBuffer創(chuàng)建時,我們指定了它的大小。
  另外的一個例子是Vector,當(dāng)聲明Vector vect=new Vector()時,系統(tǒng)調(diào)用:
public Vector() {// 缺省構(gòu)造函數(shù)
 this(10); // 容量是 10;
}
  缺省分配10個對象大小容量。當(dāng)執(zhí)行add方法時,可以看到具體實(shí)現(xiàn)為:..
public synchronized boolean add(Object o) {
 modCount++;
 ensureCapacityHelper(elementCount+1);
 elementData[elementCount++] =o;
 return true;
}
private void ensureCapacityHelper(int minCapacity) {
 int oldCapacity = elementData.length;
 if (minCapacity > oldCapacity) {
  Object oldData[] = elementData;
  int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) :
(oldCapacity * 2);
  if (newCapacity < minCapacity) {
   newCapacity = minCapacity;
  }
  elementData = new Object[newCapacity];
  System.arraycopy(oldData, 0, elementData, 0, elementCount);
 }
}
  我們可以看到,當(dāng)Vector大小超過原來的大小時,一些代碼的目的就是為了做容量的擴(kuò)充,在預(yù)先知道該Vector大小的話,可以指定其大小,避免容量擴(kuò)充的開銷,如知道Vector大小為100時,初始化是就可以象這樣。
  • 優(yōu)化循環(huán)體
  循環(huán)是比較重復(fù)運(yùn)行的地方,如果循環(huán)次數(shù)很大,循環(huán)體內(nèi)不好的代碼對效率的影響就會被放大而變的突出??紤]下面的代碼片:..
Vector vect = new Vector(1000);
...
for( inti=0; i<vect.size(); i++){
 ...
}
  for循環(huán)部分改寫成:
int size = vect.size();
for( int i=0; i>size; i++){
 ...
}
  如果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開銷,避免了循環(huán)體重復(fù)調(diào)用。
  再看如下的代碼片:..
for (int i = 0;i <100000;i++)
if (i%10 == 9) {
 ... // 每十次執(zhí)行一次
}
  改寫成也可以提高效率:..
for(inti =0,j =10; i<100000; i++,j--){
 if(j == 0){
  ... // 每十次執(zhí)行一次
  j = 10;
 }
}
  所以,當(dāng)有較大的循環(huán)時,應(yīng)該檢查循環(huán)內(nèi)是否有效率不高的地方,尋找更優(yōu)的方案加以改進(jìn)。
  • 對象的創(chuàng)建
  盡量少用new來初始化一個類的實(shí)例,當(dāng)一個對象是用new進(jìn)行初始化時,其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當(dāng)生成對象后,系統(tǒng)還要花時間進(jìn)行垃圾回收和處理。
  當(dāng)new創(chuàng)建對象不可避免時,注意避免多次的使用new初始化一個對象。
  盡量在使用時再創(chuàng)建該對象。如:
NewObject object = new NewObject();
int value;
if(i>0 )
{
 value =object.getValue();
}
  可以修改為:
int value;
if(i>0 )
{
 NewObject object = new NewObject();
 Value =object.getValue();
}
  另外,應(yīng)該盡量重復(fù)使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變量達(dá)到重用的目的。
  • 變量的注意事項(xiàng)
  盡量使用局部變量,調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。
  盡量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會隨他的實(shí)例而變化,就可以定義為靜態(tài)變量,從而使他所有的實(shí)例都共享這個變量。
  ·方法(Method)調(diào)用
  在Java中,一切都是對象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個對象,該對象是否有效,對象屬于什么類型,然后選擇合適的方法并調(diào)用。
  可以減少方法的調(diào)用,同樣一個方法:
public void CallMethod(int i ){
 if( i ==0 ){
  return;
 }
 ... // 其他處理
}
  如果直接調(diào)用,
int i = 0;
...
CallMethod(i);
  就不如寫成:
int i = 0;
...
if( i ==0 ){
 CallMethod(i);
}
  不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。
  另外,在方法前加上final,private關(guān)鍵字有利于編譯器的優(yōu)化。
  • 慎用異常處理
  異常是Java的一種錯誤處理機(jī)制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象,并進(jìn)行相關(guān)的處理,造成系統(tǒng)的開銷,所以異常應(yīng)該用在錯誤處理的情況,不應(yīng)該用來控制程序流程,流程盡量用while,if等處理。
  在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。
  • 同步
  同步主要出現(xiàn)在多線程的情況,為多線程同時運(yùn)行時提供對象數(shù)據(jù)安全的機(jī)制,多線程是比較復(fù)雜話題,應(yīng)用多線程也是為了獲得性能的提升,應(yīng)該盡可能減少同步。
  另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個方法或函數(shù),而不是整個代碼。
  • 使用Java系統(tǒng)API
  Java的API一般都做了性能的考慮,如果完成相同的功能,優(yōu)先使用API而不是自己寫的代碼,如數(shù)組復(fù)制通常的代碼如下:
int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 賦值
 strArray1 = (new String("Array: " + i));
}
for(inti=0;i<size;i++){ // 復(fù)制
 strArray2=(new String((String)a));
}
  如果使用Java提供的API,就可以提高性能:
int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 賦值
strArray1 = (new String("Array: " + i));
}
System.arraycopy(strArray1,0,strArray2,0,size); // 復(fù)制
  同樣的一個規(guī)則是,當(dāng)有大量數(shù)據(jù)的復(fù)制時,應(yīng)該使用System.arraycopy()。


三、I/O 性能

  輸入/輸出(I/O)包括很多方面,我們知道,進(jìn)行I/O操作是很費(fèi)系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時可以注意:
  • 合理控制輸出函數(shù)
        System.out.println()對于大多時候是有用的,特別是系統(tǒng)調(diào)試的時候,但也會產(chǎn)生大量的信息出現(xiàn)在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。
  特別是在發(fā)行版中,要合理的控制輸出,可以在項(xiàng)目開發(fā)時,設(shè)計(jì)好一個Debug的工具類,在該類中可以實(shí)現(xiàn)輸出開關(guān),輸出的級別,根據(jù)不同的情況進(jìn)行不同的輸出的控制。
  • 使用緩存
  讀寫內(nèi)存要比讀寫文件要快很多,應(yīng)盡可能使用緩沖。
  盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進(jìn)行處理I/O操作。
  同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高。

  四、Servlet

  Servlet采用請求——響應(yīng)模式提供Web服務(wù),通過ServletResponse以及ServletRequest這兩個對象來輸出和接收用戶傳遞的參數(shù),在服務(wù)器端處理用戶的請求,根據(jù)請求訪問數(shù)據(jù)庫、訪問別的Servlet方法、調(diào)用EJB等等,然后將處理結(jié)果返回給客戶端。
  • 盡量不使用同步
  Servlet是多線程的,以處理不同的請求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢了。
  • 不用保存太多的信息在HttpSession中
  很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網(wǎng)上商店系統(tǒng)會把購物車信息保存在該用戶的Session中,但當(dāng)存儲大量的信息或是大的對象在會話中是有害的,特別是當(dāng)系統(tǒng)中用戶的訪問量很大,對內(nèi)存的需求就會很高。
  具體開發(fā)時,在這兩者之間應(yīng)作好權(quán)衡。
  • 清除Session
  通常情況,當(dāng)達(dá)到設(shè)定的超時時間時,同時有些Session沒有了活動,服務(wù)器會釋放這些沒有活動的Session,.. 不過這種情況下,特別是多用戶并訪時,系統(tǒng)內(nèi)存要維護(hù)多個的無效Session。
  當(dāng)用戶退出時,應(yīng)該手動釋放,回收資源,實(shí)現(xiàn)如下:..
HttpSession theSession = request.getSession();
// 獲取當(dāng)前Session
if(theSession != null){
 theSession.invalidate(); // 使該Session失效
}

  五、EJB 問題

  EJB是Java服務(wù)器端服務(wù)框架的規(guī)范,軟件廠商根據(jù)它來實(shí)現(xiàn)EJB服務(wù)器。應(yīng)用程序開發(fā)者可以專注于支持應(yīng)用所需的商業(yè)邏輯,而不用擔(dān)心周圍框架的實(shí)現(xiàn)問題。EJB規(guī)范詳細(xì)地解釋了一些最小但是必須的服務(wù),如事務(wù),安全和名字等。
  • 緩存Home接口
  EJB庫使用Enterprise Bean 的客戶端通過它的Home接口創(chuàng)建它的實(shí)例??蛻舳四芡ㄟ^JNDI訪問它。服務(wù)器通過Lookup方法來獲取。
  JNDI是個遠(yuǎn)程對象,通過RMI方式調(diào)用,對它的訪問往往是比較費(fèi)時的。所以,在設(shè)計(jì)時可以設(shè)計(jì)一個類專門用來緩存Home接口,在系統(tǒng)初始化時就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。
  • 封裝Entity Bean
  直接訪問Entity Bean是個不好的習(xí)慣,用會話Bean封裝對實(shí)體Bean的訪問能夠改進(jìn)事務(wù)管理,因?yàn)槊恳粋€對get方法的直接調(diào)用將產(chǎn)生一個事務(wù),容器將在每一個實(shí)體Bean的事務(wù)之后執(zhí)行一個“Load-Store”.. 操作。
  最好在Session Bean中完成Entity Bean的封裝,減少容器的事務(wù)處理,并在Session Bean中實(shí)現(xiàn)一些具體的業(yè)務(wù)方法。
  • 釋放有狀態(tài)的Session Bean
  相當(dāng)于HttpSession,當(dāng)把一個Session Bean設(shè)為Stateful,即有狀態(tài)的Session Bean 后,應(yīng)用容器(Container)就可能有“鈍化”(Passivate)和活化(Activate)過程,即在主存和二級緩存之間對 SessionBean進(jìn)行存儲位置的轉(zhuǎn)移,在這個過程中,存在序列化過程。
  通常有狀態(tài)Session Bean的釋放是在超時時發(fā)生,容器自動的清除該對象,但是如果交給容器管理,一方面可能產(chǎn)生對象鈍化,另一方面未超時期間,系統(tǒng)還要維護(hù)一份該對象,所以如果我們確認(rèn)使用完該StatefulSession Bean后不再需要時,可以顯式的將其釋放掉,方法是調(diào)用:
theSesionBean.remove();

六、數(shù)據(jù)庫訪問

  在J2EE開發(fā)的應(yīng)用系統(tǒng)中,數(shù)據(jù)庫訪問一般是個必備的環(huán)節(jié)。數(shù)據(jù)庫用來存儲業(yè)務(wù)數(shù)據(jù),供應(yīng)用程序訪問。
  在Java技術(shù)的應(yīng)用體系中,應(yīng)用程序是通過JDBC(Java Database Connectivity)實(shí)現(xiàn)的接口來訪問數(shù)據(jù)庫的,JDBC支持“建立連接、SQL語句查詢、處理結(jié)果”等基本功能。在應(yīng)用JDBC接口訪問數(shù)據(jù)庫的過程中,只要根據(jù)規(guī)范來實(shí)現(xiàn),就可以達(dá)到要求的功能。
  但是,有些時候進(jìn)行數(shù)據(jù)查詢的效率著實(shí)讓開發(fā)人員不如所愿,明明根據(jù)規(guī)范編寫的程序,運(yùn)行效果卻很差,造成整個系統(tǒng)的執(zhí)行效率不高。
  • 使用速度快的JDBC驅(qū)動
  JDBC API包括兩種實(shí)現(xiàn)接口形式,一種是純Java實(shí)現(xiàn)的驅(qū)動,一種利用ODBC驅(qū)動和數(shù)據(jù)庫客戶端實(shí)現(xiàn),具體有四種驅(qū)動模式并各有不同的應(yīng)用范圍,針對不同的應(yīng)用開發(fā)要選擇合適的JDBC驅(qū)動,在同一個應(yīng)用系統(tǒng)中,如果選擇不同的JDBC驅(qū)動,在效率上會有差別。
  例如,有一個企業(yè)應(yīng)用系統(tǒng),不要求支持不同廠商的數(shù)據(jù)庫,這時就可以選擇模式4的JDBC驅(qū)動,該驅(qū)動一般由數(shù)據(jù)庫廠商實(shí)現(xiàn)的基于本地協(xié)議的驅(qū)動,直接調(diào)用數(shù)據(jù)庫管理系統(tǒng)使用的協(xié)議,減少了模式3中的中間層。
  • 使用JDBC連接池
  為了提高訪問數(shù)據(jù)庫的性能,我們還可以使用JDBC 2.0的一些規(guī)范和特性,JDBC是占用資源的,在使用數(shù)據(jù)庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關(guān)閉Connection。而我們知道,獲取Connection是比較消耗系統(tǒng)資源的。
  Connection緩沖池是這樣工作的:當(dāng)一個應(yīng)用程序關(guān)閉一個數(shù)據(jù)庫連接時,這個連接并不真正釋放而是被循環(huán)利用,建立連接是消耗較大的操作,循環(huán)利用連接可以顯著的提高性能,因?yàn)榭梢詼p少新連接的建立。
  一個通過DataSource獲取緩沖池獲得連接,并連接到一個CustomerDB數(shù)據(jù)源的代碼演示如下:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");
Connection conn = dataSource.getConnection("password","username");
  • 緩存DataSource
  一個DataSource對象代表一個實(shí)際的數(shù)據(jù)源。這個數(shù)據(jù)源可以是從關(guān)系數(shù)據(jù)庫到表格形式的文件,完全依賴于它是怎樣實(shí)現(xiàn)的,一個數(shù)據(jù)源對象注冊到JNDI名字服務(wù)后,應(yīng)用程序就可以從JNDI服務(wù)器上取得該對象,并使用之和數(shù)據(jù)源建立連接。
  通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是占用資源的。
  為了避免再次的JNDI調(diào)用,可以系統(tǒng)中緩存要使用的DataSource。
  • 關(guān)閉所有使用的資源
  系統(tǒng)一般是并發(fā)的系統(tǒng),在每次申請和使用完資源后,應(yīng)該釋放供別人使用,數(shù)據(jù)庫資源每個模式的含義可以參考SUN JDBC的文檔,不同是比較寶貴的,使用完成后應(yīng)該保證徹底的釋放。
  請看下面的代碼段:
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
 DataSource dataSource = getDataSource();
 // 取的DataSource的方法,實(shí)現(xiàn)略。
 conn = datasource.getConnection();
 stmt = conn.createStatement();
 rs = stmt.executeQuery("SELECT * FROM ...");
 ... // 其他處理
 rs.close();
 stmt.close();
 conn.close();
}catch (SQLException ex) {
 ... // 錯誤處理
}
  粗看似乎沒有什么問題,也有關(guān)閉相關(guān)如Connection等系統(tǒng)資源的代碼,但當(dāng)出現(xiàn)異常后,關(guān)閉資源的代碼可能并不被執(zhí)行,為保證資源的確實(shí)已被關(guān)閉,應(yīng)該把資源關(guān)閉的代碼放到finally塊:
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
 DataSource dataSource = getDataSource();
 // 取的DataSource的方法,實(shí)現(xiàn)略。
 conn = datasource.getConnection();
 stmt = conn.createStatement();
 rs = stmt.executeQuery("SELECT * FROM ...");
 ... // 其他處理
}catch (SQLException ex) {
 ... // 錯誤處理
}finally{
 if (rs!=null) {
  try {
   rs.close(); // 關(guān)閉ResultSet}
  catch (SQLException ex) {
   ... // 錯誤處理
  }
 }
 if (stmt!=null){
  try {
   stmt.close(); // 關(guān)閉Statement}
  catch (SQLException ex) {
   ... // 錯誤處理
  }
 }
 if (conn!=null){
  try {
   conn.close(); // 關(guān)閉Connection}
  catch (SQLException ex) {
   ... // 錯誤處理
  }
 }
}
  • 大型數(shù)據(jù)量處理
  當(dāng)我們在讀取諸如數(shù)據(jù)列表、報(bào)表等大量數(shù)據(jù)時,可以發(fā)現(xiàn)使用EJB的方法是非常慢的,這時可以使用直接訪問數(shù)據(jù)庫的方法,用SQL直接存取數(shù)據(jù),從而消除EJB的經(jīng)常開支(例如遠(yuǎn)程方法調(diào)用、事務(wù)管理和數(shù)據(jù)序列化,對象的構(gòu)造等)。
  • 緩存經(jīng)常使用的數(shù)據(jù)
  對于構(gòu)建的業(yè)務(wù)系統(tǒng),如果有些數(shù)據(jù)要經(jīng)常要從數(shù)據(jù)庫中讀取,同時,這些數(shù)據(jù)又不經(jīng)常變化,這些數(shù)據(jù)就可以在系統(tǒng)中緩存起來,使用時直接讀取緩存,而不用頻繁的訪問數(shù)據(jù)庫讀取數(shù)據(jù)。
  緩存工作可以在系統(tǒng)初始化時一次性讀取數(shù)據(jù),特別是一些只讀的數(shù)據(jù),當(dāng)數(shù)據(jù)更新時更新數(shù)據(jù)庫內(nèi)容,同時更新緩存的數(shù)據(jù)值。
  一個例子是,在一套企業(yè)應(yīng)用系統(tǒng)中,企業(yè)的信息數(shù)據(jù)(如企業(yè)的名稱)在多個業(yè)務(wù)應(yīng)用模塊中使用,這時就可以把這些數(shù)據(jù)緩存起來,需要時直接讀取緩存的企業(yè)信息數(shù)據(jù)。

  七、總結(jié)

  一般意義上說,參與系統(tǒng)運(yùn)行的代碼都會對性能產(chǎn)生影響,實(shí)際應(yīng)用中應(yīng)該養(yǎng)成良好的編程規(guī)范、編寫高質(zhì)量的代碼,當(dāng)系統(tǒng)性能出現(xiàn)問題時,要找到主要影響性能的瓶頸所在,然后集中精力優(yōu)化這些代碼,能達(dá)到事半功倍的效果。
  J2EE性能的優(yōu)化包括很多方面的,要達(dá)到一個性能優(yōu)良的系統(tǒng),除了關(guān)注代碼之外,還應(yīng)該根據(jù)系統(tǒng)實(shí)際的運(yùn)行情況,從服務(wù)器軟硬件環(huán)境、集群技術(shù)、系統(tǒng)構(gòu)架設(shè)計(jì)、系統(tǒng)部署環(huán)境、數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計(jì)等方面綜合考慮。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/holycup/archive/2009/09/14/4552121.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
原理分析之一:從JDBC到Mybatis
C++內(nèi)存管理
Java中的裝箱與拆箱
如何優(yōu)化JAVA程序設(shè)計(jì)和編碼,提高JAVA性能
NET 性能優(yōu)化方法總結(jié)
全國2009年10月自學(xué)考試Java語言程序設(shè)計(jì)試題.
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服