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

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

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

    Xms Xmx PermSize MaxPermSize 區(qū)別 java 內(nèi)存

    http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html http://www.educity.cn/wenda/450855.html Eclipse崩潰,錯(cuò)誤提示: MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains. It is strongly recommended that you exit and restart MyEclipse with new virtual machine memory paramters to increase this memory. Failure to do so can result in data loss. The recommended Eclipse memory parameters are: eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1.參數(shù)的含義 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 說(shuō)明后面是VM的參數(shù),所以后面的其實(shí)都是JVM的參數(shù)了 -Xms128m JVM初始分配的堆內(nèi)存 -Xmx512m JVM最大允許分配的堆內(nèi)存,按需分配 -XX:PermSize=64M JVM初始分配的非堆內(nèi)存 -XX:MaxPermSize=128M JVM最大允許分配的非堆內(nèi)存,按需分配 我們首先了解一下JVM內(nèi)存管理的機(jī)制,然后再解釋每個(gè)參數(shù)代表的含義。 1)堆(Heap)和非堆(Non-heap)內(nèi)存 按照官方的說(shuō)法:“Java 虛擬機(jī)具有一個(gè)堆,堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配。堆是在 Java 虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的。”“在JVM中堆之外的內(nèi)存稱為非堆內(nèi)存(Non-heap memory)”。 可以看出JVM主要管理兩種類型的內(nèi)存:堆和非堆。簡(jiǎn)單來(lái)說(shuō)堆就是Java代碼可及的內(nèi)存,是留給開(kāi)發(fā)人員使用的;非堆就是JVM留給自己用的, 所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如JIT編譯后的代碼緩存)、每個(gè)類結(jié)構(gòu)(如運(yùn)行時(shí)常數(shù)池、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法的代碼都在非堆內(nèi)存中。 堆內(nèi)存分配 JVM初始分配的堆內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;JVM最大分配的堆內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4。默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制; 空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到-Xms的最小限制。因此服務(wù)器一般設(shè)置-Xms、-Xmx 相等以避免在每次GC 后調(diào)整堆的大小。 說(shuō)明:如果-Xmx 不指定或者指定偏小,應(yīng)用可能會(huì)導(dǎo)致java.lang.OutOfMemory錯(cuò)誤,此錯(cuò)誤來(lái)自JVM,不是Throwable的,無(wú)法用try...catch捕捉。 非堆內(nèi)存分配 JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。(還有一說(shuō):MaxPermSize缺省值和-server -client選項(xiàng)相關(guān), -server選項(xiàng)下默認(rèn)MaxPermSize為64m,-client選項(xiàng)下默認(rèn)MaxPermSize為32m。這個(gè)我沒(méi)有實(shí)驗(yàn)。) 上面錯(cuò)誤信息中的PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域。還沒(méi)有弄明白PermGen space是屬于非堆內(nèi)存,還是就是非堆內(nèi)存,但至少是屬于了。 XX:MaxPermSize設(shè)置過(guò)小會(huì)導(dǎo)致java.lang.OutOfMemoryError: PermGen space 就是內(nèi)存益出。 說(shuō)說(shuō)為什么會(huì)內(nèi)存益出: (1)這一部分內(nèi)存用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和存放Instance的Heap區(qū)域不同。 (2)GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)LOAD很多CLASS 的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。 這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。 2)JVM內(nèi)存限制(最大值) 首先JVM內(nèi)存限制于實(shí)際的最大物理內(nèi)存,假設(shè)物理內(nèi)存無(wú)限大的話,JVM內(nèi)存的最大值跟操作系統(tǒng)有很大的關(guān)系。簡(jiǎn)單的說(shuō)就32位處理器雖然可控內(nèi)存空間有4GB,但是具體的操作系統(tǒng)會(huì)給一個(gè)限制, 這個(gè)限制一般是2GB-3GB(一般來(lái)說(shuō)Windows系統(tǒng)下為1.5G-2G,Linux系統(tǒng)下為2G-3G),而64bit以上的處理器就不會(huì)有限制了。 2. 為什么有的機(jī)器我將-Xmx和-XX:MaxPermSize都設(shè)置為512M之后Eclipse可以啟動(dòng),而有些機(jī)器無(wú)法啟動(dòng)? 通過(guò)上面對(duì)JVM內(nèi)存管理的介紹我們已經(jīng)了解到JVM內(nèi)存包含兩種:堆內(nèi)存和非堆內(nèi)存,另外JVM最大內(nèi)存首先取決于實(shí)際的物理內(nèi)存和操作系統(tǒng)。所以說(shuō)設(shè)置VM參數(shù)導(dǎo)致程序無(wú)法啟動(dòng)主要有以下幾種原因: 1) 參數(shù)中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize; 2) -Xmx的值和-XX:MaxPermSize的總和超過(guò)了JVM內(nèi)存的最大限制,比如當(dāng)前操作系統(tǒng)最大內(nèi)存限制,或者實(shí)際的物理內(nèi)存等等。說(shuō)到實(shí)際物理內(nèi)存這里需要說(shuō)明一點(diǎn)的是, 如果你的內(nèi)存是1024MB,但實(shí)際系統(tǒng)中用到的并不可能是1024MB,因?yàn)橛幸徊糠直挥布加昧恕? 3. 為何將上面的參數(shù)寫(xiě)入到eclipse.ini文件Eclipse沒(méi)有執(zhí)行對(duì)應(yīng)的設(shè)置? 那為什么同樣的參數(shù)在快捷方式或者命令行中有效而在eclipse.ini文件中是無(wú)效的呢?這是因?yàn)槲覀儧](méi)有遵守eclipse.ini文件的設(shè)置規(guī)則: 參數(shù)形如“項(xiàng) 值”這種形式,中間有空格的需要換行書(shū)寫(xiě),如果值中有空格的需要用雙引號(hào)包括起來(lái)。比如我們使用-vm C:/Java/jre1.6.0/bin/javaw.exe參數(shù)設(shè)置虛擬機(jī), 在eclipse.ini文件中要寫(xiě)成這樣: -vm C:/Java/jre1.6.0/bin/javaw.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 實(shí)際運(yùn)行的結(jié)果可以通過(guò)Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按鈕進(jìn)行查看。 另外需要說(shuō)明的是,Eclipse壓縮包中自帶的eclipse.ini文件內(nèi)容是這樣的: -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m -vmargs -Xms40m -Xmx256m 其中–launcher.XXMaxPermSize(注意最前面是兩個(gè)連接線)跟-XX:MaxPermSize參數(shù)的含義基本是一樣的,我覺(jué)得唯一的區(qū)別就是前者是eclipse.exe啟動(dòng)的時(shí)候設(shè)置的參數(shù), 而后者是eclipse所使用的JVM中的參數(shù)。其實(shí)二者設(shè)置一個(gè)就可以了,所以這里可以把–launcher.XXMaxPermSize和下一行使用#注釋掉。 4. 其他的啟動(dòng)參數(shù)。 如果你有一個(gè)雙核的CPU,也許可以嘗試這個(gè)參數(shù): -XX:+UseParallelGC 讓GC可以更快的執(zhí)行。(只是JDK 5里對(duì)GC新增加的參數(shù)) 補(bǔ)充:   如果你的WEB APP下都用了大量的第三方j(luò)ar,其大小超過(guò)了服務(wù)器jvm默認(rèn)的大小,那么就會(huì)產(chǎn)生內(nèi)存益出問(wèn)題了。 解決方法: 設(shè)置MaxPermSize大小 可以在myelipse里選中相應(yīng)的服務(wù)器比如tomcat5,展開(kāi)里面的JDK子項(xiàng)頁(yè)面,來(lái)增加服務(wù)器啟動(dòng)的JVM參數(shù)設(shè)置: -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 或者手動(dòng)設(shè)置MaxPermSize大小,比如tomcat, 修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣可以減少jar 文檔重復(fù)占用內(nèi)存 1.JVM內(nèi)存管理的機(jī)制   內(nèi)存空間劃分為:Sun JDK在實(shí)現(xiàn)時(shí)遵照J(rèn)VM規(guī)范,將內(nèi)存空間劃分為堆、JVM方法棧、方法區(qū)、本地方法棧、PC寄存器。 堆: 堆用于存儲(chǔ)對(duì)象實(shí)例及數(shù)組值,可以認(rèn)為Java中所有通過(guò)new創(chuàng)建的對(duì)象的內(nèi)存都在此分配,Heap中對(duì)象所占用的內(nèi)存由GC進(jìn)行回收,在32位操作系統(tǒng)上最大為2GB,在64位操作系統(tǒng)上則沒(méi)有限制,其大小可通過(guò)-Xms和-Xmx來(lái)控制,-Xms為JVM啟動(dòng)時(shí)申請(qǐng)的最小Heap內(nèi)存,默認(rèn)為物理內(nèi)存的1/64但小于1GB;-Xmx為JVM可申請(qǐng)的最大Heap內(nèi)存,默認(rèn)為物理內(nèi)存的1/4但小于1GB,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),JVM會(huì)增大Heap到-Xmx指定的大小,可通過(guò)-XX:MinHeapFreeRatio=來(lái)指定這個(gè)比例;當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減小Heap的大小到-Xms指定的大小,可通過(guò)-XX:MaxHeapFreeRatio=來(lái)指定這個(gè)比例,對(duì)于運(yùn)行系統(tǒng)而言,為避免在運(yùn)行時(shí)頻繁調(diào)整Heap 的大小,通常將-Xms和-Xmx的值設(shè)成一樣。 JVM方法棧: 為線程私有,其在內(nèi)存分配上非常高效。當(dāng)方法運(yùn)行完畢時(shí),其對(duì)應(yīng)的棧幀所占用的內(nèi)存也會(huì)自動(dòng)釋放。當(dāng)JVM方法棧空間不足時(shí),會(huì)拋出StackOverflowError的錯(cuò)誤,在Sun JDK中可以通過(guò)-Xss來(lái)指定其大小。 方法區(qū): 要加載的類的信息(名稱、修飾符等)、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息。方法區(qū)域也是全局共享的,在一定條件下它也會(huì)被GC,當(dāng)方法區(qū)域要使用的內(nèi)存超過(guò)其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息。在Sun JDK中這塊區(qū)域?qū)?yīng)Permanet Generation,又稱為持久代,默認(rèn)最小值為16MB,最大值為64MB,可通過(guò)-XX:PermSize及-XX:MaxPermSize來(lái)指定最小值和最大值。 本地方法棧: 用于支持native方法的執(zhí)行,存儲(chǔ)了每個(gè)native方法調(diào)用的狀態(tài)。在Sun JDK的實(shí)現(xiàn)中,和JVM方法棧是同一個(gè)。 PC寄存器: 占用的可能為CPU寄存器或操作系統(tǒng)內(nèi)存。 2.Java堆和棧的區(qū)別   Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。   在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。   堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組。在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。在堆中產(chǎn)生了一個(gè)數(shù)組或?qū)ο蠛螅€可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,在棧中的這個(gè)特殊的變量就變成了數(shù)組或者對(duì)象的引用變量,以后就可以在程序中使用棧內(nèi)存中的引用變量來(lái)訪問(wèn)堆中的數(shù)組或者對(duì)象,引用變量相當(dāng)于為數(shù)組或者對(duì)象起的一個(gè)別名,或者代號(hào)。   引用變量是普通變量,定義時(shí)在棧中分配內(nèi)存,引用變量在程序運(yùn)行到作用域外釋放。而數(shù)組&對(duì)象本身在堆中分配,即使程序運(yùn)行到使用new產(chǎn)生數(shù)組和對(duì)象的語(yǔ)句所在地代碼塊之外,數(shù)組和對(duì)象本身占用的堆內(nèi)存也不會(huì)被釋放,數(shù)組和對(duì)象在沒(méi)有引用變量指向它的時(shí)候,才變成垃圾,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個(gè)不確定的時(shí)間被垃圾回收器釋放掉。這個(gè)也是java比較占內(nèi)存的主要原因。但是在寫(xiě)程序的時(shí)候,可以人為的控制。 3.Java內(nèi)存泄露和內(nèi)存溢出   內(nèi)存泄漏:分配出去的內(nèi)存回收不了   內(nèi)存溢出:指系統(tǒng)內(nèi)存不夠用了

    posted on 2016-06-21 21:58 youngturk 閱讀(334) 評(píng)論(0)  編輯  收藏 所屬分類: 筆試題

    <2016年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結(jié)構(gòu)
    4 口語(yǔ)英語(yǔ)

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊(cè)

    EJB學(xué)習(xí)

    Flex學(xué)習(xí)

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 99在线视频免费观看视频| selaoban在线视频免费精品| 亚洲av无码不卡久久| 亚洲日产2021三区| 亚洲午夜久久久精品电影院| 亚洲第一页在线视频| 亚洲国产成人在线视频| 亚洲色欲色欲www| 亚洲 日韩经典 中文字幕| 亚洲日韩国产欧美一区二区三区| 在线精品亚洲一区二区 | 大地资源在线观看免费高清 | 国产午夜亚洲精品不卡电影| 苍井空亚洲精品AA片在线播放| 色九月亚洲综合网| 全部一级一级毛片免费看| 亚洲视频在线免费| 国产一精品一AV一免费| 99蜜桃在线观看免费视频网站| 99久久精品免费视频| 国产卡二卡三卡四卡免费网址| 免费av欧美国产在钱| 国产人成免费视频| 亚洲中文字幕无码不卡电影| 久久精品国产亚洲av麻豆| 亚洲精品在线播放| 亚洲国产aⅴ成人精品无吗| 人成电影网在线观看免费| 在线看片免费人成视频播| 免费99精品国产自在现线| 国产自产拍精品视频免费看| 亚洲人成影院在线观看| 亚洲国产二区三区久久| 亚洲人成色777777精品| 一个人看的www在线免费视频| 免费一级不卡毛片| 在线观看无码的免费网站| 男人的天堂亚洲一区二区三区| 免费观看国产精品| 久久精品亚洲中文字幕无码网站| 亚洲免费中文字幕|