基於Java堆記憶體的10個要點的總結分析

來源:互聯網
上載者:User

Java堆記憶體的10個要點 .
javaoutofmemoryerrorgenerationjvmprofiler編程當我開始學習Java編程時,我不知道什麼是堆記憶體或堆空間,我甚至不知道當對象建立時,它們被放在了哪裡。當我開始正式寫一些程式後,我會經常遇到java.lang.outOfMemoryError的報錯,之後我才開始關注什麼是堆記憶體或者說堆空間(heap space)。對大多數程式員都經曆過這樣的過程,因為學習一種語言是非常容易來的,但是學習基礎是非常難的,因為沒有什麼特定的流程讓你學習編程的每個基礎,使你發覺編程的秘訣。
對於程式員來說,知道堆空間,設定堆空間,處理堆空間的outOfMemoryError錯誤,分析heap dump是非常重要的。這個關於Java堆的教程是給我剛開始學編程的兄弟看的。如果你知道這個基礎知識或者知道底層發生了什麼,當然可能協助不是那麼大。除非你知道了對象被建立在堆中,否則你不會意識到OutOfMemoryError是發生在堆空間中的。我儘可能的將我所知道的所有關於堆的知識都寫下來了,也希望你們能夠儘可能多的貢獻和分享你的知識,以便可以讓其他人也受益。
Java中的堆空間是什嗎?
當Java程式開始運行時,JVM會從作業系統擷取一些記憶體。JVM使用這些記憶體,這些記憶體的一部分就是堆記憶體。堆記憶體通常在儲存地址的底層,向上排列。當一個對象通過new關鍵字或通過其他方式建立後,對象從堆中獲得記憶體。當對象不再使用了,被當做記憶體回收掉後,這些記憶體又重新回到堆記憶體中。要學習記憶體回收,請閱讀“Java中記憶體回收的工作原理”。
如何增加Java堆空間
在大多數32位機、Sun的JVM上,Java的堆空間預設的大小為128MB,但也有例外,例如在32未Solaris作業系統(SPARC平台版本)上,預設的最大堆空間和起始堆空間大小為 -Xms=3670K 和 -Xmx=64M.對於64位作業系統,一般堆空間大小增加約30%.但你使用Java 1.5的throughput記憶體回收行程,預設最大的堆大小為實體記憶體的四分之一,而起始堆大小為實體記憶體的十六分之一。要想知道預設的堆大小的方法,可以用預設的設定參數開啟一個程式,使用JConsole(JDK 1.5之後都支援)來查看,在VM Summary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程式的需要來改變堆記憶體大小,我強烈建議採用這種方法而不是預設值。如果你的程式很大,有很多個物件需要被建立的話,你可以用-Xms and -Xmx這兩個參數來改變堆記憶體的大小。Xms表示起始的堆記憶體大小,Xmx表示最大的堆記憶體的大小。另外有一個參數 -Xmn,它表示new generation(後面會提到)的大小。有一件事你需要注意,你不能任意改變堆記憶體的大小,你只能在啟動JVM時設定它。
堆和記憶體回收
我們知道對象建立在堆記憶體中,記憶體回收這樣一個進程,它將已死對象清除出堆空間,並將這些記憶體再還給堆。為了給記憶體回收行程使用,堆主要分成三個地區,分別叫作New Generation,Old Generation或叫Tenured Generation,以及Perm space.New Generation是用來存放建立的對象的空間,在對象建立的時候被使用。如果長時間還使用的話,它們會被記憶體回收行程移動到Old Generation(或叫Tenured Generation)。Perm space是JVM存放Meta資料的地方,例如類,方法,字串池和類層級的詳細資料。你可以查看“Java中記憶體回收的工作原理”來獲得更多關於堆和記憶體回收的資訊。
Java堆中的OutOfMemoryError錯誤
當JVM啟動時,使用了-Xms 參數設定的對記憶體。當程式繼續進行,建立更多個物件,JVM開始擴大堆記憶體以容納更多個物件。JVM也會使用記憶體回收行程來回收記憶體。當快達到-Xmx設定的最大堆記憶體時,如果沒有更多的記憶體可被分配給新對象的話,JVM就會拋出java.lang.outofmemoryerror,你的程式就會當掉。在拋出 OutOfMemoryError之前,JVM會嘗試著用記憶體回收行程來釋放足夠的空間,但是發現仍舊沒有足夠的空間時,就會拋出這個錯誤。為瞭解決這個問題,你需要清楚你的程式對象的資訊,例如,你建立了哪些對象,哪些對象佔用了多少空間等等。你可以使用profiler或者堆分析器來處理 OutOfMemoryError錯誤。“java.lang.OutOfMemoryError: Java heap space”表示堆沒有足夠的空間了,不能繼續擴大了。“java.lang.OutOfMemoryError: PermGen space”表示permanent generation已經裝滿了,你的程式不能再裝在類或者再分配一個字串了。
Java Heap dump
Heap dump是在某一時間對Java堆記憶體的快照。它對於分析堆記憶體或處理記憶體泄露和Java.lang.outofmemoryerror錯誤是非常有用的。在JDK中有一些工具可以幫你擷取heap dump,也有一些堆分析工具來幫你分析heap dump.你可以用“jmap”來擷取heap dump,它幫你建立heap dump檔案,然後,你可以用“jhat”(堆分析工具)來分析這些heap dump.
Java堆記憶體(heap memory)的十個要點:
1、Java堆記憶體是作業系統分配給JVM的記憶體的一部分。
2、當我們建立對象時,它們儲存在Java堆記憶體中。
3、為了便於記憶體回收,Java堆空間分成三個地區,分別叫作New Generation, Old Generation或叫作Tenured Generation,還有Perm Space.
4、你可以通過用JVM的命令列選項 -Xms, -Xmx, -Xmn來調整Java堆空間的大小。不要忘了在大小後面加上“M”或者“G”來表示單位。舉個例子,你可以用 -Xmx256m來設定堆記憶體最大的大小為256MB.
5、你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()來查看Java中堆記憶體的大小。
6、你可以使用命令“jmap”來獲得heap dump,用“jhat”來分析heap dump.
7、Java堆空間不同於棧空間,棧空間是用來儲存調用棧和局部變數的。
8、Java記憶體回收行程是用來將死掉的對象(不再使用的對象)所佔用的記憶體回收回來,再釋放到Java堆空間中。
9、當你遇到java.lang.outOfMemoryError時,不要緊張,有時候僅僅增加堆空間就可以了,但如果經常出現的話,就要看看Java程式中是不是存在記憶體泄露了。
10、請使用Profiler和Heap dump分析工具來查看Java堆空間,可以查看給每個對象分配了多少記憶體。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.