Java內存分析

    最近在工做中遇到了內存溢出,雖然這個問題沒用多久就用在catalina.bat和catalina.sh設置棧堆內存初始大小立時解決,但對箇中原因不甚理解,故深刻了解了一番在此分享。 java

    首先,Java內存管理原理: web

    在java中,有java程序、虛擬機、操做系統三個層次,其中java程序與虛擬機交互,而虛擬機與操做系統交互。這也就保證了java的與平臺無關性,三者的運行原理是: 服務器

      一、程序運行前:JVM向操做系統請求必定的內存空間,成爲初始內存空間!程序執行過程當中所需的內存都是由java虛擬機從這片內存空間中劃分的。 app

      二、程序運行中:java程序一直向java虛擬機申請內存,當程序所須要的內存空間超出初始內存空間時,java虛擬機會再次向操做系統申請更多的內存供程序使用! webapp

      三、內存溢出:程序接着運行,當java虛擬機已申請的內存達到了規定的最大內存空間,但程序還須要跟多的內存,這時會出現內存溢出的錯誤! 性能

      由此,咱們知道java程序所用的內存是有java虛擬機進行管理、分配的。java虛擬機規定了java程序的初始內存空間和最大內存空間。 spa

     

    內存空間邏輯劃分: 操作系統

        JVM會把申請的內存從邏輯上劃分爲三個區域,即:方法去、棧與堆。 線程

        方法區:方法去默認最大容量爲64M,java虛擬機會將加載的java類存入方法區,保存類的結構(屬性與方法),類靜態成員等內容。 對象

        堆:默認最大容量爲64M,堆存放對象持有的數據,同事保持對原類的引用。能夠簡單地理解爲對象屬性的值保存在堆中,對象調用的方法保存在方法區。

        棧:默認最大容量爲1M,在程序運行時,每當遇到方法調用時,java虛擬機就會在棧中劃分一塊內存稱爲棧幀(Stack frame),棧幀中的內存供局部變量(包括基本類型與引用類型)使用,當方法調用結束後,java虛擬機會收回此棧幀佔用的內存。

    

       在介紹了java內存相關知識點後,就來講說對內存大小的設置,對於一些規模比較大的應用,JVM的內存設置的好,就能夠在項目中取得好的效率。

        Java Heap也即堆分爲三個區:Young、Old和Permanent。

        Young保存剛實例化的對象,當該區被填滿時,GC會將對象已到Old區,Permanent區則負責保存反射對象。JVM的Heap分配可使用-X參數設定,-Xms對應初始Heap大小,-Xmx對應Java Heap最大值,-Xmn對應Young Generation的heap大小。

        JVM有2個GC線程,第一個線程負責回收Heap的Young區,第二個線程在Heap不足時,遍歷Heap,將Young區升級爲Older區,Older區的大小等於-Xmx減去-xmn,不能將-Xms的值設的過大,由於第二個線程被迫運行會下降JVM的性能。


        主要內存溢出類型:

          一、OutOfMemoryError:PermGen space

        PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,主要是被JVM存放Class和Meta信息的,Class在被Loader的時候就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不一樣,GC不會在主程序運行期對PermGen space進行清理,若是程序中有不少Class的話,就極可能出現PermGen space錯誤(好比webapp下用了大量第三方jar,其大小超過了JVM默認的大小4M就會產生比錯誤),網上一個比較推崇的設置 set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

          二、OutOfMemoryError:JavaHeap space

        JVM默認空間即(-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4,若是內存剩餘不到40%,JVM就會增大堆到Xmx設置的值,內存剩餘超過70%,JVM就會減少到Xms設置的值,因此服務器的Xmx和Xms設置通常應該設置相同避免每次GC後都要調整虛擬機堆的大小。假設物理內存無限大,那麼JVM內存的最大值跟操做系統有關,通常32位機是1.5G到3G之間,而64爲的就不會有限制了。(注:若是Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操做系統的最大限制都會引發服務器啓動不起來)

      而在設置虛擬機內存時,通常將-Xms和-Xmx選項設置爲相同,而-Xmn爲1/4的-Xmx值,Heap Size最大不要超過可用物理內存的80%。

相關文章
相關標籤/搜索