Java内存分配

前言:Java中所倡导的自动内存管理主要可以归结为两个方面:一方面是内存分配,另一方面就是回收分配给对象的内存。

对象主要是分配在新生代的Eden区上(JVM的gc操作是按照代来进行的,堆区大致被分为三大块:新生代,旧生代,持久代(虚拟的);新生代又分为eden区,s0区,s1区。引用自http://blog.sina.com.cn/s/blog_3f782322010166o7.html博客

对象由新生代编程老年代:

1、对象优先在Eden上分配,当Eden没有足够的区域时候,虚拟机将发起一次Minor GC(新生代GC,指的是发生在新生代的垃圾收集动作,Java对象大都具有朝生夕灭的特性,Minor GC非常频繁;与之相关的老年代GC Major GC/FUll GC )。

private static final int _1MB = 1024*1024;
//VM: -verbose:gc   -Xms20M  -Xmx20  -Xmn10M  -XX:ServivorRatio=8
这些参数限制对的大小为20M,并且不可以扩展,并将10M分给新生代。
在对象分配时候,首先在Eden新生代上分配,当要创建新的对象,而且以前创建的对象都还存活在新生代,新生代的空间容量<要创建的对象所需要的容量,这时候就需要进行Major GC,将所要创建的对象在新生带上创建,将原新生代的对象,转到老年代中。

2、大对象直接进入老年代

大对象就是那种很长的字符串或者数组,Java虚拟机最头疼的就是遇到一群“朝生夕死”的大对象!

写程序时,要尽量避免出现大对象,如果出现大量的大对象,可能导致内存中还有不少空间就触发垃圾回收机制。


3、长期存活的对象直接进入老年代

虚拟机采用分代管理内存的方法,因此虚拟机需要将对象进行分代。虚拟机给每一个对象定义了一个Age计数器。

Eden中的对象经历一次Minor GC后存活,被Servivor容纳,Age+1;在Survivor中没经过一次Minor GC后,Age+1.当年龄增加到一定程度(默认15),将对象转到老年代中。

可以通过-XX:MaxTenuringThreshold来设置。(动态年龄判断:Survivor中的对象并不总是到15才会转到老年代,当相同年龄的对象大小的总和大于Survivor的一半时候,年龄大于或等于改年龄的对象就会被转到老年代。)


JVM中采用分代回收内存管理机制:新生代采用复制算法;老年代中对象存活率高、没有额外空间对其进行担保(新生代可以通过老生代空间进行分配担保),采用“标记-清除”或“标记-整理”来进行回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值