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

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

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

    This Is A FineDay

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      93 隨筆 :: 0 文章 :: 69 評(píng)論 :: 0 Trackbacks

    ?JVM 內(nèi)存參數(shù)調(diào)優(yōu)

    我們前面所提到的堆內(nèi)存(heap)是由Java虛擬機(jī)控制管理的,因此,這些參數(shù)對(duì)JVM而言都有一個(gè)默認(rèn)值,但在某些情況下這些參數(shù)的默認(rèn)值并不是最優(yōu)的,這就需要我們通過(guò)調(diào)整這些參數(shù)的值來(lái)提高JVM的性能,最終提高應(yīng)用的性能指標(biāo)。

    在實(shí)際的應(yīng)用開(kāi)發(fā)中,如果應(yīng)用所使用的系統(tǒng)內(nèi)存較大,經(jīng)常會(huì)引發(fā)內(nèi)存溢出的錯(cuò)誤:

    java.lang.OutOfMemoryError <<no stack trace available>>

    java.lang.OutOfMemoryError <<no stack trace available>>

    ? ? Exception in thread "main"

    這可能是因?yàn)閼?yīng)用要使用的堆內(nèi)存(heap)超過(guò)了JVM所管理內(nèi)存范圍,如果我們適當(dāng)追加內(nèi)存值有時(shí)就可以避免這種致命錯(cuò)誤的出現(xiàn)。

    WINDOWS系統(tǒng)上你可以通過(guò)參數(shù)-verbosegc查看JVM回收內(nèi)存的信息,在HP UNIX系統(tǒng)上你可以通過(guò)-Xverbosegc:file=/tmp/gc$$.out參數(shù)將信息重定向到一個(gè)文件中。然后查看相應(yīng)的信息,例如下面的這個(gè)類。

    public class A {

    ??? ???public static void main(String args[]) {

    ??? ???? for (int i =0 ;i < 100000;++i) {

    ??????????? ???A a = new A();

    ??? ???? }

    ??? ???? System.out.println("this is a GC test");

    ??? ???}

    }

    在類Amain方法中創(chuàng)建了100 000個(gè)A對(duì)象,然后我們看一下JVM回收內(nèi)存的情況,編譯并執(zhí)行這個(gè)類:

    >java -verbosegc A

    [GC 512K->91K(1984K), 0.0027537 secs]

    this is a ?GC test

    從輸出信息中可以看出總共有1984KB的內(nèi)存被回收,耗時(shí)0.002 753 7秒。現(xiàn)在我們將類A添加一行清除對(duì)象引用的代碼:

    public class A {

    ??? ???public static void main(String args[]) {

    ??? ???? for (int i =0 ;i < 100000;++i) {

    ???????????? ??A a = new A();

    ? ?????????????a = null;

    ??? ???? }

    ??? ???? System.out.println("this is a GC test");

    ??? ???}

    }

    編譯并執(zhí)行這個(gè)類:

    >java -verbosegc A

    [GC 512K->91K(1 984K), 0.0 027 450 secs]

    this is a ?GC test

    我們 看到被回收內(nèi)存的數(shù)量并沒(méi)有變化,但是回收所需要的時(shí)間卻變成了0.002 745 0秒,后者比前者節(jié)省了0.000 008 7秒,千萬(wàn)不要小看這0.000 008 7秒,當(dāng)你的應(yīng)用足夠復(fù)雜時(shí)這個(gè)時(shí)間就會(huì)成指數(shù)級(jí)增長(zhǎng),看來(lái)我們主動(dòng)清除對(duì)象引用的方法,確實(shí)可以加速JVM對(duì)垃圾內(nèi)存的回收。

    如果再在類A中加入一行強(qiáng)制系統(tǒng)內(nèi)存回收的代碼,結(jié)果又會(huì)怎樣呢?如下所示:

    public class A {

    ?? ?public static void main(String args[]) {

    ??? ???? for (int i =0 ;i < 100000;++i) {

    ????????? ?????A a = new A();

    ??? ???????????a = null;

    ??? ???? }

    ??? ???? System.gc();

    ??? ???? System.out.println("this is a GC test");

    ??? }

    }

    編譯并執(zhí)行這個(gè)類:

    >java -verbosegc A

    [GC 512K->91K(1984K), 0.0 027 272 secs]

    [Full GC 487K->91K(1984K), 0.0 070 730 secs]

    this is a ?GC test

    系統(tǒng) 這次做了兩次內(nèi)存回收,第一次是程序中強(qiáng)制系統(tǒng)內(nèi)存回收的代碼System.gc()導(dǎo)致的內(nèi)存回收,而后者是系統(tǒng)最終的內(nèi)存回收操作,我們看到強(qiáng)制內(nèi)存回收耗時(shí)不長(zhǎng),可是卻導(dǎo)致了系統(tǒng)最終垃圾回收的時(shí)間加長(zhǎng)了很多,因此我們?cè)诓捎脧?qiáng)制系統(tǒng)垃圾回收(通過(guò)顯式調(diào)用方法System.gc())的辦法來(lái)回收系統(tǒng)垃圾內(nèi)存的辦法,還是存在一些弊端的,應(yīng)盡量少用,或者說(shuō)只在必要的時(shí)候應(yīng)用。

    上面我們提到的內(nèi)存回收操作就是回收JVM所 管理的堆內(nèi)存(heap)。當(dāng)系統(tǒng)連續(xù)申請(qǐng)內(nèi)存并且超過(guò)JVM所管理的堆內(nèi)存(heap)的最大值時(shí),就會(huì)產(chǎn)生系統(tǒng)內(nèi)存溢出的致命異常,下面我們來(lái)看一下 怎樣通過(guò)設(shè)置JVM的內(nèi)存參數(shù)來(lái)優(yōu)化JVM對(duì)內(nèi)存的管理,避免內(nèi)存溢出異常的發(fā)生。表2-1所示的就是與JVM內(nèi)存相關(guān)的參數(shù)及其說(shuō)明。

    ?

    ?

    ?

    ?

    ?

    ?

    2-1? JVM內(nèi)存相關(guān)的參數(shù)及其說(shuō)明

    JVM 堆內(nèi)存(heap)設(shè)置選項(xiàng)

    參數(shù)格式

    說(shuō)???

    設(shè)置新對(duì)象生產(chǎn)堆內(nèi)存(Setting the Newgeneration heap size

    -XX:NewSize

    通過(guò)這個(gè)選項(xiàng)可以設(shè)置Java新對(duì)象生產(chǎn)堆內(nèi)存。在通常情況下這個(gè)選項(xiàng)的數(shù)值為1 024的整數(shù)倍并且大于1MB。這個(gè)值的取值規(guī)則為,一般情況下這個(gè)值-XX:NewSize是最大堆內(nèi)存(maximum heap size)的四分之一。增加這個(gè)選項(xiàng)值的大小是為了增大較大數(shù)量的短生命周期對(duì)象

    增加Java新對(duì)象生產(chǎn)堆內(nèi)存相當(dāng)于增加了處理器的數(shù)目。并且可以并行地分配內(nèi)存,但是請(qǐng)注意內(nèi)存的垃圾回收卻是不可以并行處理的

    續(xù)表?

    JVM 堆內(nèi)存(heap)設(shè)置選項(xiàng)

    參數(shù)格式

    說(shuō)???

    設(shè)置最大新對(duì)象生產(chǎn)堆內(nèi)存(Setting the maximum New generation heap size

    -XX:MaxNewSize

    通過(guò)這個(gè)選項(xiàng)可以設(shè)置最大Java新對(duì)象生產(chǎn)堆內(nèi)存。通常情況下這個(gè)選項(xiàng)的數(shù)值為1?024的整數(shù)倍并且大于1MB

    其功用與上面的設(shè)置新對(duì)象生產(chǎn)堆內(nèi)存-XXNewSize相同

    設(shè)置新對(duì)象生產(chǎn)堆內(nèi)存的比例(Setting New heap size ratios

    -XX:SurvivorRatio

    新對(duì)象生產(chǎn)區(qū)域通常情況下被分為3個(gè)子區(qū)域:伊甸園,與兩個(gè)殘存對(duì)象空間,這兩個(gè)空間的大小是相同的。通過(guò)用-XX:SurvivorRatio=X選項(xiàng)配置伊甸園與殘存對(duì)象空間(Eden/survivor)的大小的比例。你可以試著將這個(gè)值設(shè)置為8,然后監(jiān)控、觀察垃圾回收的工作情況

    設(shè)置堆內(nèi)存池的最小值

    Setting minimum heap size

    -Xms

    通過(guò)這個(gè)選項(xiàng)可以要求系統(tǒng)為堆內(nèi)存池分配內(nèi)存空間的最小值。通常情況下這個(gè)選項(xiàng)的數(shù)值為1?024的整數(shù)倍并且大于1MB。這個(gè)值的取值規(guī)則為,一般情況下這個(gè)值(-Xms)與最大堆內(nèi)存相同,以降低垃圾回收的頻度

    設(shè)置堆內(nèi)存池的最大值(Setting maximum heap size

    -Xmx

    通過(guò)這個(gè)選項(xiàng)可以要求系統(tǒng)為堆內(nèi)存池分配內(nèi)存空間的最大值。通常情況下這個(gè)選項(xiàng)的數(shù)值為1?024的整數(shù)倍并且大于1 MB

    一般情況下這個(gè)值(-Xmx)與最小堆內(nèi)存(minimum heap size –Xms)相同,以降低垃圾回收的頻度

    取消垃圾回收

    -Xnoclassgc

    這個(gè)選項(xiàng)用來(lái)取消系統(tǒng)對(duì)特定類的垃圾回收。它可以防止當(dāng)這個(gè)類的所有引用丟失之后,這個(gè)類仍被引用時(shí)不會(huì)再一次被重新裝載,因此這個(gè)選項(xiàng)將增大系統(tǒng)堆內(nèi)存的空間

    設(shè)置棧內(nèi)存的大小

    -Xss

    這個(gè)選項(xiàng)用來(lái)控制本地線程棧的大小,當(dāng)這個(gè)選項(xiàng)被設(shè)置的較大(>2MB)時(shí)將會(huì)在很大程度上降低系統(tǒng)的性能。因此在設(shè)置這個(gè)值時(shí)應(yīng)該格外小心,調(diào)整后要注意觀察系統(tǒng)的性能,不斷調(diào)整以期達(dá)到最優(yōu)

    根據(jù)表2-1中所描述的參數(shù)意義,我們可以在啟動(dòng)應(yīng)用時(shí)為JVM設(shè)置相應(yīng)的參數(shù)值以提高系統(tǒng)的性能,例如下面的例子:

    java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8? -Xms512m

    -Xmx512m MyApplication

    類文件(.class)的大小

    Java源文件.java文件編譯成JVM 可解釋執(zhí)行的Java字節(jié)文件.class。因所采用的編譯方式的不同而大小也不同。通常.class文件的大小也存在是否占用較大內(nèi)存的問(wèn)題。通過(guò)降 低.class文件的大小,不但可以降低系統(tǒng)內(nèi)存的開(kāi)銷,還可以節(jié)省網(wǎng)絡(luò)開(kāi)銷,雖然這部分內(nèi)容與JVM內(nèi)存管理聯(lián)系不大,但是我覺(jué)得還是有必要提一下,因 為這在你開(kāi)發(fā)Applet應(yīng)用時(shí)會(huì)有幫助(注:在本書(shū)后續(xù)的章節(jié)中,將會(huì)對(duì)如何減小Java類尺寸的技術(shù)話題做更為深入的探討)。因?yàn)橐话銇?lái)說(shuō), Applet應(yīng)用都是靠網(wǎng)絡(luò)分布式傳輸由客戶端瀏覽器裝載運(yùn)行的,如果類文件較大,無(wú)疑將會(huì)增大網(wǎng)絡(luò)開(kāi)銷,降低傳輸速度無(wú)法滿足用戶的需求,并且如果類文件較大,無(wú)疑也會(huì)消耗客戶端內(nèi)存資源。我們可以通過(guò)在Java編譯器javac中添加相應(yīng)的參數(shù),來(lái)縮小類文件的大小,解決上面的問(wèn)題。

    通常有三種編譯方式會(huì)影響類文件的大小。

    1)默認(rèn)編譯方式:? javac ??A.java

    2)調(diào)試編譯方式:? javac ?–g A.java

    3)代碼編譯方式:? javac ?–g:none A.java

    例如如下所示的簡(jiǎn)單的類A

    public class A {

    ? ?????public static void main(String args[]) {

    ? ????????for (int i =0 ;i < 100000;++i) {

    ?? ???????A a = new A();

    ?? ???????}

    ?? ????}

    }

    通過(guò)上面這三種方式編譯后的類文件的大小分別為:

    默認(rèn)編譯方式:291字節(jié)。

    調(diào)試編譯方式:422字節(jié)。

    代碼編譯方式:207字節(jié)。

    采用三種不同的方式,編譯產(chǎn)生的類文件的大小差異非常大,這是什么原因?qū)е碌哪兀吭瓉?lái)在于.class文件中包含多個(gè)不同的部分或?qū)傩浴?span lang="EN-US">

    代碼(Code)屬性包含實(shí)際的方法字節(jié)碼。 源文件信息(SourceFile Information)包含用于生成.class的源文件名稱。代碼行序號(hào)表(LineNumberTable)用來(lái)映射源文件中的代碼行序號(hào)與字節(jié)碼 文件中的序號(hào)偏移。本地變量表(LocalVariableTable)用來(lái)映射本地變量與棧楨的偏移。

    & 注意? 如果你想了解字節(jié)碼文件.class的文件結(jié)構(gòu)詳細(xì)信息,請(qǐng)參考相關(guān)的技術(shù)資料,這里就不詳細(xì)講解了。

    正是由于上面這三種編譯方式生成的類文件所包含的信息不同,才導(dǎo)致了類文件的大小差異較大,其包含的信息分別如下所示。

    默認(rèn)編譯方式:代碼(Code)、源文件信息(SourceFile Information)、代碼行序號(hào)表(LineNumberTable)。

    調(diào)試編譯方式:代碼(Code)、源文件信息(SourceFile Information)、代碼行序號(hào)表(LineNumberTable)、本地變量表(LocalVariableTable)。

    代碼編譯方式:代碼(Code)。

    這就是三種編譯方式產(chǎn)生類文件大小不同的根本原因。而這三種編譯方式在程序開(kāi)發(fā)的不同階段卻都起著非常重要的作用,例如,調(diào)試編譯方式在程序的調(diào)試開(kāi)發(fā)過(guò)程中應(yīng)采用,以獲取更為詳細(xì)的調(diào)試信息。因此具體應(yīng)用上面的三種編譯方式中的哪一種,應(yīng)該適時(shí)而定。

    ?

    posted on 2008-01-14 13:55 Peter Pan 閱讀(2468) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 久久精品成人免费观看97| 亚洲国产精品久久人人爱| 亚洲AV无码久久精品成人| 无码专区—VA亚洲V天堂| 亚洲欧洲日韩国产| 欧美色欧美亚洲另类二区| 一本岛v免费不卡一二三区| 久久久久久影院久久久久免费精品国产小说 | 亚洲AV无码乱码在线观看牲色| 伊人亚洲综合青草青草久热| 亚洲天堂一区二区| 亚洲熟妇无码AV不卡在线播放 | 玖玖在线免费视频| 和日本免费不卡在线v| 免费jjzz在在线播放国产| 亚洲av无码一区二区三区乱子伦| 亚洲精品第一国产综合野| 日本永久免费a∨在线视频| 色欲色香天天天综合网站免费| 国产成人免费爽爽爽视频| 亚洲第一视频在线观看免费| 亚洲欧洲日产国产综合网| 亚洲heyzo专区无码综合| a在线观看免费视频| 成人免费无码视频在线网站| 亚洲国产一成久久精品国产成人综合 | 国产精品亚洲二区在线观看| 亚洲精品免费在线视频| 久久亚洲AV成人无码国产电影| 国产免费网站看v片在线| 在线观看免费大黄网站| 国内精品久久久久久久亚洲| 国产成+人+综合+亚洲专| 久久久免费观成人影院| 成年轻人网站色免费看| 国产亚洲精品a在线无码| 亚洲精品无码成人片久久不卡| 嫩草在线视频www免费观看 | 亚洲精品字幕在线观看| 午夜亚洲WWW湿好爽| 中国人xxxxx69免费视频|