jvm内存模型可以分为 堆、方法区、虚拟机栈、本地方法栈、程序计数器五个区域。见下图。
1.方法区
方法区是各个线程共享的内存区域,用于存储类的信息、常量与静态变量。
HotSpot VM把方法区也称为永久代,Permanent Space。永久代对垃圾回收没有显著影响。
1.1 vm参数
-XX:PermSize //永久代最小空间
-XX:MaxPermSize //永久代最大空间
示例: -XX:PermSize=100m -XX:MaxPermSize
1.2相关报错
java.lang.OutOfMemoryError:Perm space
永久代内存溢出,调大内存即可。
2.堆
堆通常是jvm内存中最大的一块,用于盛放对象。
堆又可以分为新生代与老年代,见图2-1.
permanent space为永久代空间;heap space为堆空间,它又分为新生代空间与老年代空间。
2.1新生代空间
它又可以分为2部分——Eden space与Survivor Spaces,后者包括s0与s1。
2.1.1 Eden space
Eden ['i:dən] n. 伊甸园(《圣经》中亚当和夏娃最初居住的地方)新创建的对象将放入Eden Space。
2.1.2 survivor space
又可以分为 s0 (survivor 0) 与 s1(survivor 1)。当Eden区满时,触发一次minor GC。还存活的对象将被复制到s0,同时清空Eden区域。
当Eden区再次满时,触发一次minor GC。Eden+s0(不管s0有没有满)还存活的对象将被复制到s1,同时清空Eden+s0区域。
当Eden区再次满时,触发一次minor GC。Eden+s1(不管s1有没有满)还存活的对象将被复制到s0,同时清空Eden+s1区域。
如此往复。。。
注意survivor from 与survivor to的概念和s0与s1的概念。
2.1.3 复制算法
新生代采用的就是复制算法。当survivor from 内存用完,就将还活着的对象复制到另外一块survivor to上面。复制算法不会产生内存碎片。
新生代GC也是需要stop the world的,通常为几十毫秒。
2.2 老年代空间
2.3 年龄
-XX:MaxTenuringThreshold=15
指定对象到达15岁时被移到Old区。默认值为15。
-XX:+PrintTenuringDistribution
这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。