JVM-java内存
續 JVM(java 虛拟機)一 這(zhè)裡(lǐ)繼續對(duì)java做深入的理解。
從(一)中說(shuō)明了JVM就(jiù)等同于操作系統,我們在學(xué)習操作系統的時(shí)候就(jiù)會(huì)理解内存,那麼(me)JVM也有内存處理嗎?
其實每個單獨java程序都(dōu)會(huì)啓動一個JVM,同時(shí)也指定JVM的内存大小,所以如果程序太大,就(jiù)會(huì)報錯“java.lang.OutOfMemoryError”。
有事(shì)我們在運行Tomcat中的web程序就(jiù)會(huì)出現這(zhè)個原因,因爲Tomcat默認也是使用的是JVM默認的内存,一般是物理内存的1/4,所以如果是
4G的物理内存,JVM默認最大的使用内存是1G,超過(guò)1G就(jiù)會(huì)報錯。也許我們在用Eclipse的時(shí)候,也會(huì)起(qǐ)動JVM,我們可以看配置文件
eclipse.ini中有
-Xms40m -Xmx512m
這(zhè)個也就(jiù)是代表我們在起(qǐ)動eclipse的時(shí)候默認啓動内存是40M,最大内存512M,所以我們的eclipse的内存就(jiù)運行在之間。配置JVM一般有四個參數:
-Xmx Java Heap最大值,默認值爲物理内存的1/4, 最佳設值應該視物理内存大小及計算機内其他内存開(kāi)銷而定; -Xms Java Heap初始值,Server端JVM最好(hǎo)將(jiāng)-Xms和-Xmx設爲相同值, 開(kāi)發(fā)測試機JVM可以保留默認值; -Xmn Java Heap Young區大小,不熟悉最好(hǎo)保留默認值; -Xss 每個線程的Stack大小,不熟悉最好(hǎo)保留默認值;我們可以在命令行中來設置運行JAVA的JVM信息。
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test 這(zhè)裡(lǐ)的Test就(jiù)一個科=可運行的class文件當然如果用eclipse運行,也可以配置,如下圖:
所以JVM的啓動都(dōu)會(huì)有相應的内存指定。
其實-Xmx的配置不是可以無限的設置的,除了本機的内存還(hái)與系統有關,可以參考jvm在不同系統中的最大内存空間地址 比如在windows下2G的内存最多把-Xmx1500M左右,其實我們一般寫的程序1G的最多空間以足以,空間越大,垃圾回收就(jiù)用時(shí)了,所以按照自己配置-Xmx。
配置不多說(shuō),前面(miàn)有兩(liǎng)個-Xmn、-Xss還(hái)不知道(dào)是是麼(me)?那我們就(jiù)看一下JVM有哪些分類。我們學(xué)過(guò)操作系統,内存都(dōu)有很多分類寄存器、RAM、ROM、DRAM……到目前我還(hái)是沒(méi)有分清楚,那麼(me)JVM也有内存分類嗎?
其實JVM也有五個地方可以存儲數據。
一、寄存器,這(zhè)裡(lǐ)是最快的,我們都(dōu)知道(dào)這(zhè)個是CUP中的存儲區域,當然最快。但我們寫JAVA程序就(jiù)不能(néng)控制寄存器,也感覺不到她的存在(c、c++是可以的)。所以在我們編程中與它的關系不大,不過(guò)它的确存在。
二、堆棧,存儲java的一些特殊的對(duì)象。
三、堆,存儲我們new的對(duì)象,所說(shuō)的垃圾回收,應該就(jiù)是處理這(zhè)個堆把。
四、常量存儲(不懂)
五、非RAM存儲(不懂)
ok,内存值得學(xué)習,一下,繼續研究。