七、老年代

在这里插入图片描述

前言

一个对象想要活到老年代实在太难了,因为现在的程序属于多线程访问,所有的业务操作都是针对于线程操作的,那么所有的线程在整体的操作过程之中时间都是非常短的。这些对象都是在年轻代中开辟,很少能跑到老年代中。

老年代

老年代空间主要目的是用于存储由Eden发送过来的对象,一般在经历过好几次“Minor GC”还会被保存下来的对象,才会被复制到老年代,一般老年代的内存空间大小会设置的比年轻代要大,这样可以存放更多的对象,同时在老年代中执行GC的次数也相对较少,当老年代内存不足时会自动执行“Full GC”(也称为“Major GC”)。

一般项目中会有很多共享对象,比如数据库连接就是共享的,而且还很大。

老年代GC算法

标记-清理

从根集合开始扫面,对存活的对象进行标记,标记完成后,再扫描整个空间中未标记的对象,并进行回收。
清理前
如上图红色部分,清理前有很多无用对象
清理后
如上图,清理后无用对象释放,但是会留下无用的内存碎片(蓝色部分),这时候需要对碎片进行一次整理,可是这又会发生一次非常可怕的性能问题。

标记-压缩

标记阶段与“标记-清楚”算法相同,但在压缩阶段有所不同。在回收不存活对象所占的内存空间后,会将其他所有存活对象都往左端空闲空间移动,并更新引用其对象指针。
清理前
清理后
此算法不会产生内存碎片,可由于是清除后又进行了一步压缩,所以性能成本高。

两种算法是虚拟机根据电脑环境选择的,也可以手动配置。

老年代配置参数

01 -XX:NewRatio 设置年轻代与老年代的比率
02 -XX:+UseAdaptiveSizePolicy 控制是否采用动态控制策略,如果动态控制,则动态调整Java堆中各个区域的大小及进入老年代的年龄
03 -XX:PretenureSizeThreshold 控制直接升入老年代的对象大小,大于这个值的对象会直接分配在老年代中

其中重要的是03项。默认情况下,所有的对象都会通过年青代进行创建,经过很多次MinorGC后将其保存在老年代之中,但是现在有些对象的内容特别庞大。可以让其不经过年轻代而将其直接保存到老年代之中。设置“ -XX:PretenureSizeThreshold”参数即可。
在这里插入图片描述
一般良好的程序开发,是不可能出现这样的问题的。也有例外的情况,如分页查找,我们通常是通过数据库分页好拿来的数据很少。可是要是将成千上万条数据拿出来在程序中分页,做程序算法分页,那内存分配会出问题,Full GC(处理很耗性能)也会频繁,那就要设置这个参数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值