首頁  >  文章  >  Java  >  分享十個Java堆記憶體的要點

分享十個Java堆記憶體的要點

Y2J
Y2J原創
2017-04-26 10:11:231207瀏覽

本篇文章是對Java堆記憶體的10個要點進行了詳細的分析介紹,需要的朋友參考下

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堆空間,可以查看給每個物件分配了多少記憶體。

以上是分享十個Java堆記憶體的要點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn