(四)-对象内存的分配策略

简介: Java所承诺的自动内存管理主要是:给对象分配内存,回收分配给对象的内存.在Java虚拟机的五块内存空间中,程序计数器、Java虚拟机栈、本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要分配的内存大小,并且由于都是线程私有,因此它们的内存空间都随着线程的创建而创建,线程的结束而回收.也就是这三个区域的内存分配和回收都具有确定性,垃圾回收器不需要在这里花费太大的精力.而Java虚拟机中的方法区因为是用来存储类信息、常量、静态变量,这些数据的变动性较小,因此不是Java内存管理重点需要关注的区域.而对于堆,所有线程共享,所有的对象都需要在堆中创建和回收.虽然每个对象的

1 对象优先在Eden区中分配

目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代.


在新生代中为了防止内存碎片,垃圾收集器一般都选用”复制”算法.因此,堆内存的新生代被进一步分为:Eden区+Survior1区+Survior2区.


每次创建对象时,首先会在Eden区中分配.

若Eden区已满,则在Survior1区中分配.

若Eden区+Survior1区剩余内存太少,导致对象无法放入该区域时,就会启用”分配担保”,将当前Eden区+Survior1区中的对象转移到老年代中,然后再将新对象存入Eden区.


2 大对象直接进入老年代

所谓”大对象”就是指一个占用大量连续内存空间的对象,如很长的字符串及数组.


当发现一个大对象在Eden区+Survior1区中存不下的时候就需要分配担保机制把当前Eden区+Survior1区的所有对象都复制到老年代中去.

一个大对象能够存入Eden区+Survior1区的概率比较小,发生分配担保的概率比较大,而分配担保需要涉及到大量的复制,就会造成效率低下.

因此,对于大对象我们直接把他放到老年代中去,从而就能避免大量的复制操作.

那么,什么样的对象才是”大对象”呢?


  • -XX:PretrnureSizeThreshold参数
    该参数用于设置大小超过该参数的对象被认为是”大对象”,直接分配在老年代.
    注意:该参数只对Serial和ParNew收集器有效.

3 生命周期较长的对象进入老年代

老年代用于存储生命周期较长的对象,那么我们如何判断一个对象的年龄呢?


新生代中的每个对象都有一个年龄计数器,当新生代发生一次MinorGC后,存活下来的被移动到Survivor空间的对象的年龄就加一,在Survivor区每熬过一次MinorGC,年龄就加一,当年龄超过一定值(默认15)时,就将该对象转移到老年代中.


  • -XXMaxTenuringThreshold参数
    设置该参数后,只要超过该参数的新生代对象都会被转移到老年代中.

4 对象年龄的动态判定

在Survivor空间中,如果年龄相同的对象的内存大小总和超过了Survivor空间的一半,那么所有年龄相同的对象和超过该年龄的对象都会被转移到老年代中.无须等到MaxTenuringThreshold要求的年龄.

5 “分配担保”策略详解

在发生MinorGC前,JVM首先会检查老年代中最大可用的的连续空间是否大于新生代中所有对象的大小.若此条件


  • 成立,那么MinorGC可以确保安全进行.
  • 不成立,JVM会查看HandlePromotionFailure设置值是否允许担保失败.若允许,继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小
  • 若大于,将尝试一次MinorGC,虽然此次MinorGC是有风险的.
  • 若小于或HandlePromotionFailure设置不允许冒险,则进行一次FullGC.通过清除老年代中废弃数据来扩大老年代空闲空间,以便给新生代作担保.

注意:

1. 分配担保是老年代为新生代作担保.

2. 新生代中使用”复制”算法实现垃圾回收,老年代中使用’标记-清除”或”标记-整理”算法实现垃圾回收,只有使用”复制”算法的区域才需要分配担保,因此新生代需要分配担保,而老年代不需要分配担保.


目录
相关文章
|
4月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
569 3
|
10月前
|
存储 分布式计算 监控
阿里云服务器实例经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i详解与选择策略
在阿里云现在的活动中,可选的云服务器实例规格主要有经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例,虽然阿里云在活动中提供了多种不同规格的云服务器实例,以满足不同用户和应用场景的需求。但是有的用户并不清楚他们的性能如何,应该如何选择。本文将详细介绍阿里云服务器中的经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例的性能、适用场景及选择参考,帮助用户根据自身需求做出更加精准的选择。
|
6月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
392 4
AI代理内存消耗过大?9种优化策略对比分析
|
5月前
|
机器学习/深度学习 监控 安全
解密虚拟化弹性内存:五大核心技术与实施策略
本文深入解析虚拟化环境中实现内存弹性管理的五大核心技术与实施策略。内容涵盖内存架构演进、关键技术原理、性能优化方法及典型问题解决方案,助力提升虚拟机密度与资源利用率。
265 0
|
5月前
|
边缘计算 算法 Java
Java 绿色计算与性能优化:从内存管理到能耗降低的全方位优化策略与实践技巧
本文探讨了Java绿色计算与性能优化的技术方案和应用实例。文章从JVM调优(包括垃圾回收器选择、内存管理和并发优化)、代码优化(数据结构选择、对象创建和I/O操作优化)等方面提出优化策略,并结合电商平台、社交平台和智能工厂的实际案例,展示了通过Java新特性提升性能、降低能耗的显著效果。最终指出,综合运用这些优化方法不仅能提高系统性能,还能实现绿色计算目标,为企业节省成本并符合环保要求。
226 0
|
弹性计算 安全 数据库
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
作为云计算服务核心组件,虚拟化内存管理直接影响业务系统性能表现。本文详解了内存优化方案与技术实践,助您降低30%资源浪费。
235 0
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
|
10月前
|
机器学习/深度学习 存储 PyTorch
PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型
在大规模深度学习模型训练中,GPU内存容量常成为瓶颈,特别是在训练大型语言模型和视觉Transformer时。本文系统介绍了多种内存优化策略,包括混合精度训练、低精度训练(如BF16)、梯度检查点、梯度累积、张量分片与分布式训练、
478 14
PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型
|
10月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
11月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
394 13
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
|
11月前
|
机器学习/深度学习 编解码 BI
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
454 3
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用