資源描述:
《jvm內(nèi)存參數(shù)詳解以及配置調(diào)優(yōu)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、JVM的結(jié)構(gòu)從功能上分,Java虛擬機(jī)主要由六個(gè)部分組成,可以分成三類:第一類:JVMAPI:就是我們最常用的JavaAPI,它是開(kāi)發(fā)人員和Java交互的入口,它主要是JAVA_HOME/jre/lib下的運(yùn)行時(shí)類庫(kù)rt.jar和編譯相關(guān)的tools.jar第二類:JVM內(nèi)部組件類裝載器(ClassLoader):將ByteArray的.class文件裝載、鏈接和初始化。內(nèi)存管理(MemoryManagent):為對(duì)象分配內(nèi)存,以及釋放內(nèi)存。后者就是垃圾回收GarbageCollector(GC)。由于
2、JVM最復(fù)雜的、最影響性能的就是GC,所以內(nèi)存管理一般就指垃圾回收。診斷接口(DiagosticsInterface):這主要體現(xiàn)在JVMTI(jdk1.4下的JVMPI和JVMDI),它主要用來(lái)診斷程序的問(wèn)題和性能,一般提供給工具廠商實(shí)現(xiàn)。如eclispeIDE下的debug功能,Jprofiler性能調(diào)優(yōu)工具。類解釋器(Interpreter):解釋裝載進(jìn)虛擬機(jī)的class對(duì)象,包括JIT等特性相關(guān)。第三類:平臺(tái)相關(guān)接口(PlatformInterface):主要為了跨操作系統(tǒng)平臺(tái)重用JVM代碼,不
3、過(guò),它和我們開(kāi)發(fā)人員關(guān)系不大。在以上六個(gè)組件中,我們開(kāi)發(fā)人員最關(guān)心的是ClassLoader和GC,用Java做系統(tǒng)框架、容器和它們密切相關(guān)。做業(yè)務(wù)系統(tǒng)時(shí)一些基礎(chǔ)代碼也和它們打交道,譬如最常用的Class.forName(),Thread.currentThread.getContextClassLoader()。我們仔細(xì)想想,為什么是上面兩個(gè)問(wèn)題?因?yàn)椋臀覀僣lass的整個(gè)生命周期最為相關(guān):怎么將一個(gè)class和相關(guān)class加載進(jìn)來(lái),class實(shí)例什么時(shí)候創(chuàng)建,什么時(shí)候被銷毀?所以,下面的部分我
4、們要專門討論這些問(wèn)題。在JVM中有兩種垃圾方式,一種叫做Minor(次收集),另一種叫做Major(主收集)。其中Minor在Young?Generation的空間被對(duì)象全部占用后執(zhí)行,主要是對(duì)Young?Generation中的對(duì)象進(jìn)行垃圾收集。而Major是針對(duì)于整個(gè)Heap?size的垃圾收集。其中Minor方式的收集經(jīng)常發(fā)生,并且Minor收集所占用的系統(tǒng)時(shí)間小。Major方式的垃圾收集則是一種“昂貴”的垃圾收集方式,因?yàn)樵贛ajor要對(duì)整個(gè)Heap?size進(jìn)行垃圾收集,這會(huì)使得應(yīng)用停頓的時(shí)間
5、變得較長(zhǎng)。?java?-jar?-server?-verbose:gc?-XX:+UseParNewGC?-Xmn8m?-Xms32m?-Xmx32m?SwingSet2.jar使用了-XX:+UseParNewGC選項(xiàng)的minor收集的時(shí)間要比不使用的時(shí)候優(yōu)。java?-jar?-verbose:gc?-XX:+UseConcMarkSweepGC?-XX:+UseParNewGC?-Xmn64m?-Xms256m?-Xmx256m?SwingSet2.jar采用-XX:+UseConcMarkSwe
6、epGC選項(xiàng)在Heap?Size?比較大而且Major收集時(shí)間較長(zhǎng)的情況下使用更合適·堆(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)建的?!薄霸贘VM中堆之外的內(nèi)存稱為非堆內(nèi)存(Non-heapmemory)”??梢钥闯鯦VM主要管理兩種類型的內(nèi)存:堆和非堆。簡(jiǎn)單來(lái)說(shuō)堆就是Java代碼可及的內(nèi)存,是留給開(kāi)發(fā)人員使用的;非堆就是JVM留給自己用的,所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所
7、需的內(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)整堆的大小。·非堆內(nèi)存分配JVM使用-XX:PermSize設(shè)
8、置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4?!VM內(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)下為2