首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JVM学习之:内存储器的分配以及回收

2012-08-29 
JVM学习之:内存的分配以及回收 对于操作系统而言,内存的管理主要包含两个部分,分配和回收,因为JVM分担了程

JVM学习之:内存的分配以及回收

 对于操作系统而言,内存的管理主要包含两个部分,分配和回收,因为JVM分担了程序员的内存管理细节,所以虚拟机也帮助程序员完成了这两件事情。

一般情况下提到的内存分配主要是指在堆中的Eden区中的分配,少数情况下可能会直接将对象分配在老年区,但是分配规则主要依赖于具体的环境以及对垃圾回收器的配置,下面将介绍几种常见的内存分配以及回收的策略,并结合具体的测试程序以及输出情况进行讲


分配策略

    1:对象优先在Eden区上分配

   

public class AlloctionLargeObejct {/**验证大对象直接进入老年去 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+UseSerialGC * -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails * -XX:PretenureSizeThreshold=1048576 */public static final int _1M = 1024 << 10;public static void main(String[] args) {testAllolaction();}public static void testAllolaction() {byte[] all1, all2, all3, all4;all1 = new byte[_1M << 2];}

Heap
 def new generation   total 9216K, used 507K [0x00000000055e0000, 0x0000000005fe0000, 0x0000000005fe0000)
  eden space 8192K,   6% used [0x00000000055e0000, 0x000000000565eee0, 0x0000000005de0000)
  from space 1024K,   0% used [0x0000000005de0000, 0x0000000005de0000, 0x0000000005ee0000)
  to   space 1024K,   0% used [0x0000000005ee0000, 0x0000000005ee0000, 0x0000000005fe0000)
 tenured generation   total 10240K, used 1024K [0x0000000005fe0000, 0x00000000069e0000, 0x00000000069e0000)
   the space 10240K,  10% used [0x0000000005fe0000, 0x00000000060e0018, 0x00000000060e0200, 0x00000000069e0000)
 compacting perm gen  total 21248K, used 3000K [0x00000000069e0000, 0x0000000007ea0000, 0x000000000bde0000)
   the space 21248K,  14% used [0x00000000069e0000, 0x0000000006cce3b0, 0x0000000006cce400, 0x0000000007ea0000)
No shared spaces configured.

关于上面程序有两点需要注意

(1) -XX:PretenureSizeThreshold 参数不支持M单位的使用,所以只能使用1048576来表示1M

(2)PretenureSizeThreshold-XX:+UseSerialGC来指定Serial作为垃圾收集器参数只支持Serial以及ParNew两种垃圾收集器,所以运行参数使用


    3:长期存活的对象直接进入老年区

      因为虚拟机分为年轻代和老年代,那么虚拟机就应该知道哪些对象应该放在老年代,哪些对象应该放在年轻代,这里就引入了对象年龄的概念,虚拟机规范规定,当对象在Eden区中经过一次年轻代的回收成功转入Survivor之后,它的年龄就为一,从此没发生一次年轻代的垃圾回收,只要他还在,那么它的年龄就一直加1,知道达到虚拟机的一个最大值(默认为15),为了可以灵活的控制这个年龄,虚拟机提供了一个参数 -XXMaxTenuringThreshold参数来控制这个年龄,验证过程通前面两种相同,读者可以自行进行验证

回收测率

    1:Survivor 区中的对象不满足一定年龄也可以进入老年区

    2:空间分配担保



热点排行