选自毕玄的<<分布式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对堆采用分代管理的方式
注:(持久代在方法区中分配,请勿视)
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对应的值