原文:10 points about Java Heap Space or Java Heap Memory
对一个java developer来说,知道java中的Heap,设置Heap的大小,分析Heap中的Memory的回收是非常重要的。
java中什么是Heap Space?
当一个java程序启动JVM,从操作系统那里取得一些内存,JVM就从这些内存来满足它的需要,这些内存中的一部分就作为Heap了。Heap在内存地址中从底部开始,往上移动。当不论用什么方式创建一个对象时,给对象分配的内存就在Heap中,当对象die或者Garbage Collector回收内存时,对象使用的内存还给Heap Space。了解更多Garbage Collector。
怎么增加java Heap size?
在大部分32位的Sun JVM上默认Heap Size是128M,但这个因JVM不同而不同。
在jdk 5 及以后,可以使用图形化工具JConsole查看JVM及java application的内存使用情况。
-Xms Heap的初始大小
-Xmx Heap的最大大小
-Xmn Heap中new generation大小
更多java -X
C:\Users\Admin>java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
-Xdiag show additional diagnostic messages
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc:<file> log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms<size> set initial Java heap size.........................
-Xmx<size> set maximum Java heap size.........................
-Xss<size> set java thread stack size
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni perform additional checks for JNI functions
-Xshare:off do not attempt to use shared class data
-Xshare:auto use shared class data if possible (default)
-Xshare:on require using shared class data, otherwise fail.
-XshowSettings show all settings and continue
-XshowSettings:all
show all settings and continue
-XshowSettings:vm show all vm related settings and continue
-XshowSettings:properties
show all property settings and continue
-XshowSettings:locale
show all locale related settings and continue
java的堆和垃圾回收器
java中对象创建在堆内,垃圾回收器工作在堆内,为Heap回收内存空间。
为了Garbage Collection工作,Heap被分成3个部分:New Generation,Old or Tenured Generation,Perm space。
New Generation用于存放新创建的对象,随着程序运行,有些对象dies,但仍然live,被GC移到Old or Tenured Generation。Perm space存放类和方法的Meta data,String pool,Class层面的详细信息。
java中的OutOfMemoryError
当java Heap达到它的默认最大值或者-Xmx指定的值,无法给新创建的object分配空间了,就会抛出“OutOfMemoryError”,在抛出前,JVM会先执行GC,如果GC后还是这样,那就抛出该异常。要解决这个问题,需要明白你的程序都创建了哪些对象,这些对象占用了多少内存,使用profiler或者heap analyser来跟踪分析该异常。"java.lang.OutOfMemoryError: Java heap space"意思是java Heap没有足够的空间了,也无法往大expand。 "java.lang.OutOfMemoryError: PermGen space" 意思是java Heap的Prem Space满了,无法再加载一个新类或者分配一个String了。
java Heap Dump
java Heap Dump是java Heap memory在某一时间点的snapshot。对分析,定位内存泄露或者OutOfMemoryError很有用。jdk提供了这样的工具,用“jmap”搞一张Heap Dump,用“jhat”来分析Heap Dump.