java性能,java性能調優實戰

本文目錄一覽:

北大青鳥java培訓:Java初期學者程序性能容易的問題測試?

1、介紹在開發中,性能測試是設計初期容易忽略的問題,開發人員會為了解決一個問題而「不擇手段」,所參與的項目中也遇到了類似問題,字符串拼接、大量的調用和數據庫訪問等等都對系統的性能產生了影響,可是大家不會關心這些問題,「CPU速度在變快」,「內存在變大」,並且,「好像也沒有那麼慢吧」。

有很多商業的性能測試軟件可供使用,如Jprofiler、JProbeProfiler等,但在開發當中顯得有些遙遠而又昂貴。

2、目標本文將講述如何利用語言本身提供的方法在開發中進行性能測試,找到系統瓶頸,進而改進設計;並且在盡量不修改測試對象的情況下進行測試。

3、預備知識面向對象編程通過抽象繼承採用模塊化的來求解問題域,但是模塊化不能很好的解決所有問題。

有時,這些問題可能在多個模塊中都出現,像日誌功能,為了記錄每個方法進入和離開時的信息,你不得不在每個方法里添加log(“insomemethod”)等信息。

如何解決這類問題呢?將這些解決問題的功能點散落在多個模塊中會使冗餘增大,並且當很多個功能點出現在一個模塊中時,代碼變的很難維護。

因此,AOP(AspectOrientedProgramming)應運而生。

如果說OO(AobjectOrientedProgramming)關注的是一個類的垂直結構,那麼AOP是從水平角度來看待問題。

動態代理類可以在運行時實現若干接口,每一個動態代理類都有一個Invocationhandler對象與之對應,這個對象實現了InvocationHandler接口,通過動態代理的接口對動態代理對象的方法調用會轉而調用Invocationhandler對象的invoke方法,通過動態代理實例、方法對象和參數對象可以執行調用並返回結果。

說到AOP,大家首先會想到的是日誌記錄、權限和事務,是的,AOP是解決這些問題的好辦法。

性能測試主要包括以下幾個方面:計算性能:可能是人們首先關心的,北大青鳥認為簡單的說就是執行一段代碼所用的時間內存消耗:程序運行所佔用的內存大小啟動時間:從你啟動程序到程序正常運行的時間可伸縮性(scalability)用戶察覺性能(perceivedperformance):不是程序實際運行有多快,而是用戶感覺程序運行有多快.

優化JAVA性能

添加較小的輔助性函數在最初版本的Swing工具包中 創建過多的Point Rectangle和Dimension對象會嚴重地影響程序的性能 儘管一次在一個Point或Rectangle對象中返回多個值似乎更有效率 但這樣作的代價要比調用多個方法高得多 在最近的Swing版本推出之前 這個問題可以通過簡單地在組件或其他類中添加一些輔助性的方法得到改善 如下所示 public int getX() { return myBounds x; } public int getY() { return myBounds y; } public int getHeight() { return myBounds height; } public int getWidth() { return myBounds width; } 現在 調用程序可以在不創建臨時對象的情況下得到同樣的結果 如下所示 int x = ponent getX(); int y = ponent getY(); int h = ponent getHeight(); int w = ponent getWidth(); 原來的getBounds()仍然可以使用 較小的輔助性函數只不過提供了一種實現同樣目標的效率更高的方法 其結果是 Rectangle的接口將完全暴露在組件的接口中 當修改Swing使之支持並可以使用這些較小的輔助性函數後 其結果是 Swing中的許多操作的運行速度都比原來快了二倍 由於GUI代碼對性能比較敏感 這一改進的意義是重大的 這種技術帶來的負作用是對象擁有的方法更多了 而且要獲取同一種信息可以有多種方法 這就使文件變得相當大而且也更加複雜了 不利於用戶採用這一技術 但是 象Swing的例子顯示的那樣 在對性能要求比較高的情況下 這種優化技術還是十分有效的 可變性的利用除了在組件中添加象上面討論的getX()等具有簡單數據類型值的臨時函數外 Java 還使用了其他的技術來減少在AWT和Swing中的對象創建活動 在組件和其他的GUI類中添加另一種版本的getBounds() 就可以在沒有創建臨時對象的前提上使調用程序得到象Rectangle類型的返回值 public Rectangle getBounds(Rectangle returnVal) {  returnVal x = myBounds x;  returnVal y = myBounds y;  returnVal height = myBounds height;  returnVal width = myBounds width;  return returnVal; } 調用程序仍然必須創建一個Rectangle對象 不過 可以在以後的調用中重用它 如果一個調用程序反覆調用許多Component對象 就可以創建一個Rectangle對象並在每個Component中使用它 需要注意的是 這一技術只適用於可變的對象類型 不可能通過這種方式減少創建String類對象 結合二家之長一個更好的解決Point等簡單類的對象創建問題的方法是使得Point類成為不可變的 然後再定義一個可變的子類 具體方法如下面的例子所示 public class Point {  protected int x y;  public Point(int x int y) { this x = x; this y = y; }  public final int getX() { return x; }  public final int getY() { return y; } } public class MutablePoint extends Point {  public final void setX(int x) { this x = x; }  public final void setY(int y) { this y = y; } } public class Shape {  private MutablePoint myLocation;  public Shape(int x int y) { myLocation = new MutablePoint(x y); }  public Point getLocation() { return (Point) myLocation; } } 在上面的例子中 Shape可以安全地返回myLocation的地址 因為調用程序如果試圖修改這些域或調用他們的 調節器 就會返回一個出錯信息 當然 調用程序仍然可以將Point轉換為MutablePoint 但很明顯這會帶來不安全性 雖然調用程序也會得到它們所需要的返回值 )C++的開發人員會注意到 這一技術與C++中的返回一個Rectangle的常量地址(const Rectangle)有點類似━━Java不具備這樣的特性 在Java 類庫中的java math BigInteger類中 一個類無需創建新的對象就返回一個 只讀的 對象 MutableBigInteger類不是公開的 它只供java math類庫內部使用 但由於BigInteger類中的一些方法(例如gcd())是由許多的算術操作組成的 完成這些操作而無需創建臨時對象將極大地改善程序的性能 lishixinzhi/Article/program/Java/JSP/201311/19787

北大青鳥java培訓:簡單的Java性能調優技巧?

大多數JAVA開發人員理所當然地以為性能優化很複雜,需要大量的經驗和知識。

好吧,不能說這是完全錯誤的。

  優化應用程序以獲得最佳性能不是一件容易的事情。

但是,這並不意味着如果你不具備這些知識,就不能做任何事情。

這裡有一些易於遵循的調優方式,遼寧java培訓建議可以做個參考!  大部分建議是針對Java的。

但也有若干建議是與語言無關的,可以應用於所有應用程序和編程語言。

在討論專門針對Java的性能調優技巧之前,讓我們先來看看通用技巧。

  1.在你知道必要之前不要優化  這可能是最重要的性能調整技巧之一。

你應該遵循常見的最佳實踐做法並嘗試高效地實現用例。

但是,這並不意味着在你證明必要之前,你應該更換任何標準庫或構建複雜的優化。

  在大多數情況下,過早優化不但會佔用大量時間,而且會使代碼變得難以閱讀和維護。

更糟糕的是,這些優化通常不會帶來任何好處,因為你花費大量時間來優化的是應用程序的非關鍵部分。

  那麼,你如何證明你需要優化一些東西呢?  首先,你需要定義應用程序代碼的速度得多快,例如,為所有API調用指定最大響應時間,或者指定在特定時間範圍內要導入的記錄數量。

在完成這些之後,你就可以測量應用程序的哪些部分太慢需要改進。

然後,接着看第二個技巧。

  2.使用分析器查找真正的瓶頸  在你遵循第一個建議並確定了應用程序的某些部分需要改進後,那麼從哪裡開始呢?  你可以用兩種方法來解決問題:  ·查看你的代碼,並從看起來可疑或者你覺得可能會產生問題的部分開始。

  ·或者使用分析器並獲取有關代碼每個部分的行為和性能的詳細信息。

  希望不需要我解釋為什麼應該始終遵循第二種方法的原因。

  很明顯,基於分析器的方法可以讓你更好地理解代碼的性能影響,並使你能夠專註於最關鍵的部分。

如果你曾使用過分析器,那麼你一定記得曾經你是多麼驚訝於一下就找到了代碼的哪些部分產生了性能問題。

老實說,我第一次的猜測不止一次地導致我走錯了方向。

  3.為整個應用程序創建性能測試套件  這是另一個通用技巧,可以幫助你避免在將性能改進部署到生產後經常會發生的許多意外問題。

你應該總是定義一個測試整個應用程序的性能測試套件,並在性能改進之前和之後運行它。

  這些額外的測試運行將幫助你識別更改的功能和性能副作用,並確保不會導致弊大於利的更新。

如果你工作於被應用程序若干不同部分使用的組件,如數據庫或緩存,那麼這一點就尤其重要。

北大青鳥java培訓:Java應用的五項性能優化技巧?

要想對Java應用代碼進行優化,我們首先需要分析其具體工作原理。

事實上,影響性能優化效果的因素多種多樣,我們需要從垃圾回收、操作系統設置以及虛擬機制等多個角度着眼,方可順利完成任務。

在今天的文章中,江西IT培訓將分享五項性能優化技巧,希望能為你的Java應用提升工作帶來啟示。

1.從最小Heap分配入手2.使用各類Java性能工具3.使用StringBuilder而非+運算符4.避免使用迭代器5.建立更好的並發控制機制

Java程序性能優化-代理模式(5)

  代理模式( )

在以上代碼中 使用CtField make()方法和CtNewMehod make()方法在運行時生成了代理類的字段和方法 這些邏輯由Javassist的CtClass對象處理 將Java代碼轉換為對應的位元組碼 並生成動態代理類的實例

注意 與靜態代理相比 動態代理可以很大幅度地減少代碼行數 並提升系統的靈活性

在Java中 動態代理類的生成主要涉及對ClassLoader的使用 這裡以CGLIB為例 簡要闡述動態類的加載過程 使用CGLIB生成動態代理 首先需要生成Enhancer類實例 並指定用於處理代理業務的回調類 在Enhancer create()方法中 會使用DefaultGeneratorStrategy Generate()方法生成動態代理類的位元組碼 並保存在byte數組中 接着使用ReflectUtils defineClass()方法 通過反射 調用ClassLoader defineClass()方法 將位元組碼裝載到ClassLoader中 完成類的加載 最後使用ReflectUtils newInstance()方法 通過反射 生成動態類的實例 並返回該實例 無論使用何種方法生成動態代理 雖然實現細節不同 但主要邏輯都如圖 所示

圖   實現動態代理的基本步驟

前文介紹的幾種動態代理的生成方法 性能有一定差異 為了能更好地測試它們的性能 去掉DBQuery類中的sleep()代碼 並使用以下方法測試

public static final int CIRCLE= ;

public static void main(String[] args) throws Exception {

IDBQuery d=null;

long begin=System currentTimeMillis()

d=createJdkProxy()                      //測試JDK動態代理

System out println( createJdkProxy: +(System currentTimeMillis() beg    in))

System out println( JdkProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJdkProxy: +(System currentTimeMillis() begin    ))

begin=System currentTimeMillis()

d=createCglibProxy()                    //測試CGLIB動態代理

System out println( createCglibProxy: +(System currentTimeMillis() b    egin))

System out println( CglibProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callCglibProxy: +(System currentTimeMillis() beg    in))

begin=System currentTimeMillis()

d=createJavassistDynProxy()             //測試Javaassist動態代理

System out println( createJavassistDynProxy: +(System currentTimeMil    lis() begin))

System out println( JavassistDynProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJavassistDynProxy: +(System currentTimeMilli    s() begin))

begin=System currentTimeMillis()

d=createJavassistBytecodeDynamicProxy()     //測試Javassist動態代理

System out println( createJavassistBytecodeDynamicProxy: +(System cu    rrentTimeMillis() begin))

System out println( JavassistBytecodeDynamicProxy class: +d getClass()

getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJavassistBytecodeDynamicProxy: +(System curr    entTimeMillis() begin))

}

       返回目錄 Java程序性能優化 讓你的Java程序更快 更穩定

編輯推薦

       Java程序設計培訓視頻教程

       J EE高級框架實戰培訓視頻教程

       J ME移動開發實戰教學視頻

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

lishixinzhi/Article/program/Java/gj/201311/27830

Java程序性能優化-代理模式(6)

  代理模式( )

以上代碼分別生成了 種代理 並對生成的代理類進行高頻率的調用 最後輸出各個代理類的創建耗時 動態類類名和方法調用耗時 結果如下

createJdkProxy:

JdkProxy class:$Proxy

callJdkProxy:

createCglibProxy:

CglibProxy class:$javatuning ch proxy IDBQuery$$EnhancerByCGLIB$$b a bbf

callCglibProxy:

createJavassistDynProxy:

JavassistDynProxy class:javatuning ch proxy IDBQuery_$$_javassist_

callJavassistDynProxy:

createJavassistBytecodeDynamicProxy:

JavassistBytecodeDynamicProxy class:javatuning ch proxy IDBQueryJavaassistBytecodeProxy

callJavassistBytecodeDynamicProxy:

可以看到 JDK的動態類創建過程最快 這是因為在這個內置實現中defineClass()方法被定義為native實現 故性能高於其他幾種實現 但在代理類的函數調用性能上 JDK的動態代理就不如CGLIB和Javassist的基於動態代碼的代理 而Javassist的基於代理工廠的代理實現 代理的性能質量最差 甚至不如JDK的實現 在實際開發應用中 代理類的方法調用頻率通常要遠遠高於代理類的實際生成頻率(相同類的重複生成會使用cache) 故動態代理對象的方法調用性能應該作為性能的主要關注點

注意 就動態代理的方法調用性能而言 CGLIB和Javassist的基於動態代碼的代理都優於JDK自帶的動態代理 此外 JDK的動態代理要求代理類和真實主題都實現同一個接口 而CGLIB和Javassist沒有強制要求

Hibernate中代理模式的應用

用代理模式實現延遲加載的一個經典應用就在Hibernate框架中 當Hibernate加載實體bean時 並不會一次性將數據庫所有的數據都裝載 默認情況下 它會採取延遲加載的機制 以提高系統的性能 Hiberante中的延遲加載主要有兩種 一是屬性的延遲加載 二是關聯表的延時加載 這裡以屬性的延遲加載為例 簡單闡述Hibernate是如何使用動態代理的

假定有用戶模型

public class User implements java io Serializable {

private Integer id;

private String name;

private int age;

//省略getter和setter

使用以下代碼 通過Hibernate加載一條User信息

public static void main(String[] args) throws SecurityException

NoSuchFieldException

IllegalArgumentException

IllegalAccessException {

//從數據庫載入ID為 的用戶

User u=(User)HibernateSessionFactory getSession() load(User class )

//打印類名稱

System out println( Class Name: +u getClass() getName())

//打印父類名稱

System out println( Super Class Name: +u getClass() getSuperclass()

getName())

//實現的所有接口

Class[] ins=u getClass() getInterfaces()

for(Class cls:ins){

System out println( interface: +cls getName())

}

System out println(u getName())

}

       返回目錄 Java程序性能優化 讓你的Java程序更快 更穩定

編輯推薦

       Java程序設計培訓視頻教程

       J EE高級框架實戰培訓視頻教程

       J ME移動開發實戰教學視頻

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

lishixinzhi/Article/program/Java/gj/201311/27829

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/153960.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-15 03:24
下一篇 2024-11-15 03:24

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論