<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    月亮的太陽

    小乖的BLOG
    posts - 114, comments - 41, trackbacks - 0, articles - 27
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    性能調優的基本知識和JDK調優

    Posted on 2005-12-25 13:14 月亮的太陽 閱讀(673) 評論(0)  編輯  收藏 所屬分類: 編程

    基本知識

    1.1 性能是什么

    在性能調優之前,我們首先來了解一下性能是什么?關于性能,我想每個學習過Java的人都能列出幾點,甚至可以夸夸其談。在《Java TM Platform Performance》一書中,定義了如下五個方面來作為評判性能的標準:

    1)      運算的性能——哪一個算法的執行性能最好?

    2)      內存的分配——程序運行時需要耗費多少內存?

    3)      啟動的時間——程序啟動需要多長時間?這在Web項目中的影響不大,但要注意部分程序需要部署或運行在客戶端時的情形(比如applet程序)。

    4)      程序的可伸縮性——在壓力負載的情況下,程序的性能如何?

    5)      性能的感知——用戶在什么情況下會覺得程序的性能不好?

    以上五個方面,在具體的使用場景可以有選擇的去評判。至于這五方面的性能調優,在后續的章節中將會陸續的給以相應的性能調優策略。

    1.2 調優的規則

    我們只需要關心對我們程序有影響,可以察覺到的性能問題,而不是每一個類中的每一個方法我們都需要想方設法的提高性能。如果程序的性能沒有達到我們所期望的要求,我們才需要考慮如何優化性能。同樣的,晦澀的代碼雖然提高了程序的性能,但同時可能帶給我們的是維護的噩夢。我們需要折中的考慮以上兩種情況,使得程序的代碼是優美的,并且運行的足夠快,達到客戶所期望的性能要求。

    優化代碼甚至會導致不良的結果,Donald Knuth(一位比較牛比較有影響的人物,具體是誰,我也忘了,誰知道,可以告訴我一下,謝謝!)曾說過,“Premature optimization is the root of all evil”。在開始性能調優前,需要先指出不優化代碼的一些理由。

    1)      如果優化的代碼已經正常工作,優化后可能會引入新的bug

    2)      優化代碼趨向于使代碼更難理解和維護;

    3)      在一個平臺上優化的代碼,在另一個平臺上可能更糟;

    4)      花費很多時間在代碼的優化上,提高了很少的性能,卻導致了晦澀的代碼。

    確實,在優化前,我們必須認真的考慮是否值得去優化。

    1.3 調優的步驟

    一般我們提高應用程序的性能劃分為以下幾個步驟:

    1)      明確應用程序的性能指標,怎樣才符合期望的性能需求;

    2)      在目標平臺進行測試;

    3)      如果性能已經達到性能指標,Stop

    4)      查找性能瓶頸;

    5)      修改性能瓶頸;

    6)      返回到第2步。

    JDK調優

    2.1 選擇合適的JDK版本

    不同版本的JDK,甚至不同廠家的JDK可能都存在著很大的差異,對于性能優化的程度不同。一般來說,盡可能選擇最新發布的穩定的JDK版本。最新的穩定的JDK版本相對以前的JDK版本都會做一些bug的修改和性能的優化工作。

    2.2 垃圾收集Java堆的優化

    垃圾收集就是自動釋放不再被程序所使用的對象的過程。當一個對象不再被程序所引用時,它所引用的堆空間可以被回收,以便被后續的新對象所使用。垃圾收集器必須能夠斷定哪些對象是不再被引用的,并且能夠把它們所占據的堆空間釋放出來。如果對象不再被使用,但還有被程序所引用,這時是不能被垃圾收集器所回收的,此時就是所謂的“內存泄漏”。監控應用程序是否發生了內存泄漏,有一個非常優秀的監控工具推薦給大家——Quest公司的JProbe工具,使用它來觀察程序運行期的內存變化,并可產生內存快照,從而分析并定位內存泄漏的確切位置,可以精確定位到源碼內。這個工具的使用我在后續的章節中還會做具體介紹。

    Java堆是指在程序運行時分配給對象生存的空間。通過-mx/-Xmx-ms/-Xms來設置起始堆的大小和最大堆的大小。根據自己JDK的版本和廠家決定使用-mx-ms-Xmx-XmsJava堆大小決定了垃圾回收的頻度和速度,Java堆越大,垃圾回收的頻度越低,速度越慢。同理,Java堆越小,垃圾回收的頻度越高,速度越快。要想設置比較理想的參數,還是需要了解一些基礎知識的。

    Java堆的最大值不能太大,這樣會造成系統內存被頻繁的交換和分頁。所以最大內存必須低于物理內存減去其他應用程序和進程需要的內存。而且堆設置的太大,造成垃圾回收的時間過長,這樣將得不償失,極大的影響程序的性能。以下是一些經常使用的參數設置:

    1)      設置-Xms等于-XmX的值;

    2)      估計內存中存活對象所占的空間的大小,設置-Xms等于此值,-Xmx四倍于此值;

    3)      設置-Xms等于-Xmx1/2大小;

    4)      設置-Xms介于-Xmx1/101/4之間;

    5)      使用默認的設置。

    大家需要根據自己的運行程序的具體使用場景,來確定最適合自己的參數設置。

    除了-Xms-Xmx兩個最重要的參數外,還有很多可能會用到的參數,這些參數通常強烈的依賴于垃圾收集的算法,所以可能因為JDK的版本和廠家而有所不同。但這些參數一般在Web開發中用的比較少,我就不做詳細介紹了。在實際的應用中注意設置-Xms-Xmx使其盡可能的優化應用程序就行了。對于性能要求很高的程序,就需要自己再多研究研究Java虛擬機和垃圾收集算法的機制了。可以看看曹曉鋼翻譯的《深入Java虛擬機》一書。

    Tracker:http://www.tkk7.com/patrick/archive/2005/12/22/25117.html

    主站蜘蛛池模板: 国产亚洲一区二区手机在线观看| 国产乱子影视频上线免费观看| 亚洲精品无码Av人在线观看国产 | 免费又黄又硬又爽大片| 亚洲精品美女久久久久久久| 好吊妞在线成人免费| 亚洲精品无码中文久久字幕| 好男人视频在线观看免费看片| 亚洲成a人片在线观看天堂无码| 免费看AV毛片一区二区三区| 亚洲高清一区二区三区电影| 天堂亚洲免费视频| 久久精品无码专区免费| 亚洲va无码手机在线电影| 免费福利电影在线观看| 亚洲精品动漫在线| 女人张腿给男人桶视频免费版| 视频一区二区三区免费观看| 中文亚洲AV片不卡在线观看| 十八禁在线观看视频播放免费| 亚洲综合一区二区精品导航| 成人性生免费视频| 人体大胆做受免费视频| 亚洲AV无码专区国产乱码电影| 日本h在线精品免费观看| 亚洲色大成网站www尤物| 亚洲高清视频一视频二视频三| AAA日本高清在线播放免费观看| 亚洲综合久久1区2区3区| 日本高清免费不卡在线| 三年片免费观看大全国语| 亚洲欧洲春色校园另类小说| 国产一级淫片视频免费看| 99精品视频免费| 亚洲中文无码永久免| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲美女高清一区二区三区 | 曰批全过程免费视频在线观看| 国产精品亚洲天堂| 午夜亚洲国产理论秋霞| 国产网站在线免费观看|