探索JVM 内存分配

Java中的堆内存与栈内存:

栈内存主要用于Java 代码的加载和执行,一个典型的例子是递归次数过多,JVM会抛出一个

Runtime错误StackOverflowError,栈内存的分配与管理完全依赖于JVM本身。

内存可以分为大致分为: 永久Generation(Perm Gen), 长时Generation (Old Gen),短时

Generation (New/Young Gen)


永久Generation(permanent generation):主要用来存储VM的对象信息,理论上来说应用

程序需要加载的class越多,需要的Perm Gen也会越大,所有的类和方法对象信息(MetaData)

将会存储在永久Generation中,对象将会在长时Generation或者短时Generation中,JVM中提

供调整永久Generation的参数为-XX:PermSize=32m 与-XX:MaxPermSize, 永久内存主要是

non-heap内存

长时Generation (Old Generation):JVM默认的Old Generation是 Tenured Generation, 应

用程序大多数的堆内存分配都发生在短时Generation(YoungGeneration)上,如果对象在经过几

个垃圾回收周期以后还存在于YoungGeneration, JVM将会自动把对象移到长时Generation

(TenuredGeneration),长时Generation中垃圾回收发生的频率将大大低于短时Generation.

短时Generation(Young Generation):由两个部分组成Eden Space 和 Survivor Space对应

的JVM参数为-XX:NewRatio和-XX:SurvivorRatio, 任何新创建的对象操作都会发生在Eden

Space. 短时Generation的堆内存中,JVM的垃圾回收会经常发生用来清除无用对象。


上图是JDK6在实时运行过程中堆内存的活动情况。

堆内存回收JVM参数详解:

参数-XX:+UseParallelGC表示并行GC收集者(Collector)是多线程环境下使用的,默认情况下主

机有多少个CPU垃圾回收器就创建多少个垃圾回收者线程,垃圾回收者线程的数目可以通过JVM

参数-XX:ParallelGCThreads=n (n desirednumber) 来控制,图示是一个使用并行GC的例子


参数-XX:+UseParNewGC表示并行Young GC,它与并发低中断收集者(concurrent low pause

collector)集成在一起使用,而且并发收集者参数-XX:+UseParallelGC不能与-XX:+UseParNewGC参

数同时使用。一个使用-XX:+UseParNewGC参数的效果如下:


参数-XX:+UseConcMarkSweepGC表示使用并发低中断收集者作为GC Collector,为了使CMS GC更

好的工作,推荐设置相同的你永久内存最小和最大size,在本例中我的设置值如下:

-XX:PermSize=32m

-XX:MaxPermSize=128m

-XX:+UseConcMarkSweepGC

效果图示如下:


内存分配参数详解:

-XX:PermSize 表示请求初始分配永久性内存大小

-XX:MaxPermSize表示分配的最大的永久性内存大小

-Xmx512m表示JVM最大的可用内存为512MB

-Xms128m表示初始启动JVM分配的为128MB

-Xmn64m表示初始分配给Eden Space内存大小,理论上不要分配太大的内存块给它。

XX:+UseLargePages -在JDK5之后新加了对大分页内存的支持参数

-Xss表示分配线程栈的内存大小,如果过小可能导致抛出StackOverflowError

在一个1GB物理内存中,Java App进程启动参数配置例子:

-Xmx512m

-Xms512m

-XX:MaxNewSize=24m

-XX:NewSize=24m

-XX:+UseConcMarkSweepGC

JDK6中默认值PermSize为16MB, MaxPermSize为64MB。默认的CodeCache的大小为32MB

在32位的JDK中JVM支持的最大内存值大概在2GB左右,在64位的JDK版本中,理论上没有

限制。

参考引用:

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

PDF document - 《INSIDE THE JAVA VIRTUAL MACHINE》

研究工具:

Java YourKit 9.0


你可能感兴趣的:(探索JVM 内存分配)