JVM技术之旅-有几种情况对象直接进入Old区

news/2025/2/1 22:57:30/

推荐资源汇总

自由只存在于束缚之中,没有堤岸,哪里来江河? —— 金斯伯格

  • JVM的堆内存中分为年轻代与老年代,年轻代又分为Eden区与Survivor区
  • 新对象的创建会分配在年轻代,对象何时进入老年代呢?又有什么样的对象适合放在老年代呢?
  • JVM实现的自动内存管理主要是针对对象内存的回收和对象内存的分配
  • *了解对象何时进入老年代有利于我们合理分配堆内存,减少FullGC的发生。

目前主流的垃圾收集器都会采用分代回收算法,因此,新创建的对象都会优先分派在新生代的Eden区内,在新生代中为了防止内存碎片问题,因此垃圾收集器一般都选用"复制"算法。

堆内存的新生代分为:Eden区+Survior1区+Survior2区

📕📕 内存分配流程 📕📕

在对象的对象头信息中存储着对象的迭代年龄(MaxTenuringThreshold),迭代年龄会在每次 YoungGC之后对象的移区操作中增加, 每执行一次MiniorGC。当这个年龄大于到 15(默认) 之后, 这个对象将会被移入老年代.

可以通过这个参数设置这个年龄值

- XX:MaxTenuringThreshold
  • 当首次加载分配大对象空间而发生YoungGC的时候:会进行初始化PretenureThresSizehold这个值的。
  • PretenureThresSizehold=N,有一些占用大量连续内存空间的对象在被分配内存开始就会直接进入老年代这样的大对象一般是一些数组,长字符串之类的对象

我们可以通过这个参数设置大对象,这个限额的大小:

- XX:PretenureSizeThreshold

注意:此参数只对Serial及ParNew两款收集器有效

  • *若Survior(to)区剩余内存太少,导致对象无法放入该区域时,就会启用"分配担保",将多出的数据对象直接存转移到老年代/或者直接放入老年代,然后清空Eden区和Survior(from)区

  • 虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代, 如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到 MaxTenuringThreshold中要求的年龄

📕📕 强引用 📕📕

平常的代码创建对象都属于强引用,之后当对象变为垃圾对象才会被回收。

📕📕 软引用 📕📕

被SoftReference这个类包裹起来的对象,在进行垃圾收集发现剩余空间不够的时候,全部已创建软引用对象会被一次性回收,这种引用类型常用于对内存比较敏感的缓存中

📕📕 弱引用 📕📕

被WeakReference这个类包裹起来的对象,每次进行垃圾收集操作的时候都会将弱引用对象一次性回收,基本不使用

📕📕 虚引用📕📕

plantomReference又称幽灵引用,随时都会被回收

📕📕 未确认-对象动态年龄判断 📕📕

此策略发生在Survivor区,当Survivor区中的一批对象的总大小大于Survivor区空间大小的一半,在这个区域中,对象年龄大于这批对象的最大年龄的所有对象会被移入老年代.

  • 策略一:将可能长期存活的对象直接放入老年代
  • 策略二:避免移区时的复制操作浪费资源
  • 策略三:不能将还有引用的对象当做垃圾回收掉
  • *策略四:将可能长期存活的对象直接放入老年代

观察这几条策略并结合GC区别我们可以发现一些端倪

  • 不应放入长期对象与较大对象占用空间
  • 存活时间短的对象应让其在年轻代存活直至死亡
  • 因为这些对象放入老年代后很快死亡,又不能及时回收,造成内存浪费,更快的触发FullGC

因此在程序运行过程中,合理设置参数,使一些可能长期存活的框架对象与缓存对象,一些大对象应放入老年代


http://www.ppmy.cn/news/1008758.html

相关文章

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网:https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…

GitHub的基本使用教程

GitHub是一个基于web的版本控制和协作平台。它允许开发人员将他们的代码存储库存储在云中,并与其他人一起进行工作。GitHub还提供了各种工具和功能来帮助开发人员管理和组织他们的代码项目,包括拉出请求、问题跟踪、代码评论等等。此外,它托管…

kafka-保证数据不重复-生产者开启幂等性和事务的作用?

1. 生产者开启幂等性为什么能去重? 1.1 场景 适用于消息在写入到服务器日志后,由于网络故障,生产者没有及时收到服务端的ACK消息,生产者误以为消息没有持久化到服务端,导致生产者重复发送该消息,造成了消…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量(C#) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取…

Docker网络模型详解

目录 一、Docker网络基础 1、端口映射 使用-P选项时Docker会随机映射一个端口至容器内部的开放端口 使用docker logs查看Nginx的日志 查看映射的随机端口范围 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port : 端口映射参数中指定了宿主…

Java超级玛丽小游戏制作过程讲解 第三天 创建并完成常量类02

public class StaticValue {//背景public static BufferedImage bgnull;public static BufferedImage bg2null;//马里奥向左跳跃public static BufferedImage jump_Lnull;//马里奥向右跳跃public static BufferedImage jump_Rnull;//马里奥向左站立public static BufferedImage…

MonthCalendar控件基本使用

作用:日历控件,用于选择年月日 常用属性: 是否显示今天、今天上面加一个圆圈、显示多少周 显示当前日期 常用事件: 日期变化 后台代码示范: //日历日期发生变化时触发该函数private void monthCalendar1_DateChang…

spring boot 配置文件和属性注入

文章目录 配置文件位置和路径自定义配置文件 属性注入添加yaml文件的支持 配置文件 位置和路径 当我们创建一个 Spring Boot 工程时,默认 resources 目录下就有一个 application.properties 文件,可以在 application.properties 文件中进行项目配置&am…