JVM中的新生代,老年代和永久代

1、新生代(大小为Eden+1个Survivor)
在堆中,新生代主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了)。新生代采用的复制算法,即将新生代分为3个区:较大的Eden和两个较小的Survivor(默认的Eden:Survivor = 8:1)。发生在新生代的GC为Minor GC 。在Minor GC时会将新生代中还存活着的对象复制进一个Survivor中,然后对Eden和另一个Survivor进行清理。所以,平常可用的新生代大小为Eden的大小+一个Survivor的大小。
2、老年代
老年代则是存放那些在程序中经历了好几次回收仍然还活着或者特别大的对象(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了)。老年代采用的是标记-清除或者标记-整理算法,这两个算法主要看虚拟机采用的哪个收集器,两种算法的区别是:标记-清除可能会产生大量连续的内存碎片。在老年代中的GC则为Major GC。Major GC和Full GC会造成stop-the-world。
3、永久代
JVM的方法区,也被称为永久代。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。这个区中的东西比老年代和新生代更不容易回收。
4、新生代进入老年代依据
(1)大对象直接进入老年代:需要大量连续内存空间的java对象,典型的字符创和字节数组,虚拟机提供可一个设置-XX:
PretenureSizeThreshold参数,大于参数的对象就会直接就进入老年代。
(2)分配担保机制:当Minor GC时,新生代存活的对象大于Survivor的大小时,这时一个Survivor装不下它们,那么它们
就会进入老年代
(3)长期存活对象,对象在Eden初始化,并经历一次Minor GC仍存活,并能被Survior容纳,就将被移动到Survivor空间,对象+1岁,当年龄增加到一定程度就进入老年代中,通过-XX:MaxTenuringThreshold来设置这个临界点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值