jvm内存管理笔记二

      选自毕玄的<<分布式java应用>>   

 

    堆:

      堆用于存储对象的实例及数组值,  可以认为java所有通过new创建的对象的内存都在Heap中进行分,Heap中对象所占用的内存由gc进行回收.大小可通过-Xms和-Xmx控制。  32位操作系统最大为2GB,64位无限制

   -Xms为jvm启动时申请的最小Heap内存,默认为物理内存的1/64,但小于1GB

   -Xmx为jvm可申请的最大Heap内存,默认为物理内存的1/4,但小于1GB,默认当空余堆内存小于40%时,jvm会增大Heap到

-Xmx指定的大小,当空余堆内存大于70%时,jvm会减小Heap到-Xms指定的大小

 

  为了让内存回收高效,sunjdk对堆采用分代管理的方式

 

 

 


jvm内存管理笔记二

注:(持久代在方法区中分配,请勿视)

 

 

  1.新生代(New Generation)

   大多数情况下,java程序中新建的对象都在新生代分配内存, 新生代由Eden Space和2块相同大小的Survivor Space(又为S0和S1或From和To)构成,

 

当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能<<红色部分 转自http://developer.51cto.com/art/201001/175883.htm>>

 

 

   通过-Xmn指定新生代大小, 通过-XX:SurvivorRation调整Eden Space和 Survivor Space的大小

 

 2.旧生代(Old Generation 或 Tenuring Generation)

    用于存放新生代中经过多次垃圾回收依然存放的对象,例如:缓存对象 

    新建的对象可能在旧生代上分配内存,主要有2种(由不同的GC实现来决定):

   1.大的数组对象,且数组中无引用对象

   2.大对象,可通过在启动参数上设置-XX:PrtenureSizeThreshold=1024(单位为字节,默认为0)来代表当对象超过多大时就不在新生代分配,在旧生代分配

 

  旧生代的值所占用内存的大小为-Xmx对应的值减去-Xmn对应的值