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

jvm内存储器管理笔记二

2012-09-06 
jvm内存管理笔记二??? ? 选自毕玄的分布式java应用 ?? ???? 堆:????? 堆用于存储对象的实例及数组值,?

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对应的值

?

?

?

热点排行