实战:内存分配与回收策略

news2025/2/27 20:44:09

 java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存。

1 前置知识

1.1 Minor GC 与Full GC

Minor GC: 新生代GC,是指发生新生代的垃圾收集动作。Minor GC非常频繁,回收速度一般也比较快。

Full GC: 老年代GC,也称Major GC,是指老年代的GC,出现了Major GC经常会伴随至少一次的Minor GC(并发绝对),Major GC的速度一般会比Minor GC的慢10倍以上。

Minor GC

当年轻代空间不足时(这里指当时是Eden区而非Survivor区)

Full GC

  1. 调用System.gc(),系统建议执行Full GC,但非绝对;
  2. 老年代空间不足;
  3. 方法区空间不足;
  4. 通过Minor GC后进入老年代的平均大小大于老年代的可用空间;
  5. 由Eden区,survivor from 向survivor to区复制时,对象大于to可用内存,此时会把该对象转存到老年代,但是老年代可用空间小于该对象大小。

表 Minor GC与Full GC触发条件

图 正常情况下Minnor GC运行过程

上图所述的情况是对象没进入老年代的场景。存在以下情况,对象会进入老年代。

1)大对象直接进入老年代。超过-XX:PretenureSizeThreshold(仅对部份回收器有效,对于Parallel回收器,该参数不生效)设定的大小后会直接进入老年代。

2)长期存活的对象将进入老年代。对象在Survivor区中没熬过一次Minor GC,年龄就增加1岁。当增加到一定程度(默认为15),就会被晋升到老年代中。年龄阈值由-XX:MaxTenuringThreshold设置。

3)动态对象年龄判断。如果在Survivor空间中相同年龄所有对象的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可直接进入老年代。

4)空间分配担保进入。Minor GC后,如果Survivor无法容纳存活下来的对象,那么这些对象会被直接送入老年代(前提是老年代本身还有容纳这些对象的剩余空间)。

1.2 虚拟机及垃圾收集器的日志

在JDK 9以前,HotSpot并没有提供统一的日志处理框架,虚拟机各个功能模块的日志开关分布在不同的参数上。直到JDK 9,HotSpot所有功能的日志都收归到了“-Xlog”参数上。

本文的JDK版本的JDK 8。

-Xms

程序启动时占用内存大小。一般来说,设置值大点,程序会启动得快一点。

-Xmx

程序运行期间最大可占用的内存大小。

-Xss

每个线程的堆栈大小。

-Xmn

新生代大小。

-XX:+PrintGCDetails

打印gc详细信息。

-XX:SurvivorRatio=8

新生代中Eden与两个Survivor的比值。

-XX:MaxTenuringThreshold=15

新生代进入老年代的年龄阈值。

jdk 9之前的常用日志参数

1.2.1 gc详细日志字段说明

图 gc日志截图

图 GC日志参数字段

图 GC日志-Eden空间字段

2 实战:新生代到老年代

使用命令java -XX:+PrintCommandLineFlags -version 查看回收器等信息:

图 当前系统使用的回收器相关信息

如图所示,当前系统使用的回收器是ParallelGC。本节验证的是Serial加Serial Old收集器组合下的内存分配和回收策略。vm配置如下:

-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails  -XX:SurvivorRatio=8

2.1 大对象直接进入老年代

XX:PretenureSizeThreshold参数指定大于等于该设置值的对象直接在老年代分配。在vm配置中加上-XX:PretenureSizeThreshold=3M。

public class BigObject {
    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) {
        byte[] all1,all2,all3,all4,all5,all6,all7;
        all2 = new byte[2 * _1MB];
    }
}

图 BigObject运行结果

如上图所示,对象还未进入老年代。先将all2 = new byte[2*_1MB] 改成 all2 = new byte[3*_1MB]。

图 all2更改大小后的运行结果

大对象已直接进入老年代。

2.2 长期存活的对象将进入老年代

当对象年龄增加到一定程度(-XX:MaxTenuringThreshold参数控制,默认为15),在下次GC时,就会晋升到老年代。在vm配置中加上:

-XX:MaxTenuringThreshold=1 -XX:PretenureSizeThreshold=7M

public class BigObject {
    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) {
        byte[] all1,all2,all3,all4,all5,all6,all7;
        all1 = new byte[_1MB / 4];
        all2 = new byte[_1MB * 6];
        all2 = null;
        all2 = new byte[_1MB * 6];
        all2 = null;
        all2 = new byte[_1MB * 6];
    }
}

图 MaxTenuringThreshold=1两次GC后运行结果

将配置修改为-XX:MaxTenuringThreshold=15

图 MaxTenuringThreshold=15两次GC后运行结果

如图所示,两次GC后,对象依旧进入老年代。这是因为HotSpot虚拟机并不永远要求对象年龄必须达到MaxTenuringThreshold设定的值。如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

要实现PretenureSizeThreshold的效果,同时不受Survivor的影响,则将代码修改如下:将all1 = new byte[_1MB/4 ] 更改成all1 = new byte[_1MB/10]。(即保证survivor中的对象大小不超过survivor的一半。)

图 MaxTenuringThreshold=15两次GC后运行结果2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac m1安装stable-diffusion

安装stable-diffusion 安装Homebrew安装python及其他依赖下载model安装Stable-Diffusion-WebUI执行./webui.sh作图http://127.0.0.1:7860 安装Homebrew 查询是否安装 brew -v安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.…

14.网络爬虫—selenium详讲

网络爬虫—selenium详讲 一selenium简介Selenium 的优点 二安装模块三设置浏览器驱动确认版本:查找对应驱动下载驱动 四使用模块selenium选取元素方法selenium嵌套页面元素定位selenium网页下拉selenium下拉表选择selenium行为链selenium等待 五错误解决方案六结束语…

[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree

语义分析_抽象语法树_反汇编 回忆 上次回顾了一下历史 python 是如何从无到有的看到 Guido 长期的坚持和努力 python究竟是如何理解 print(“hello”)的?这些ascii字母如何被组织起来执行? 纯文本 首先编写Guido的简历 print("1982------Gui…

LeetCode刷题集(五)(LeetCode1.两数之和)

学习目标: 掌握LeetCode第一题两数之和 学习内容: LeetCode第一题两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会…

ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ

编辑:ll ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ 型号:AD9951YSVZ 品牌:ADI/亚德诺 封装:HTQFP-48 批号:2023 引脚数量:48 安装类型:表面贴装型 AD9951YSVZ汽车芯片 特征 400 MS…

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》 往事只能回味味道 于 2021-11-20 02:30:53 发布831 收藏 1 分类专栏: shell 文章标签: ubuntu linux udp 版权 ​编辑shell专栏收录该内容 3 篇文章0 订阅 订阅…

Mysql日志系统-InnoDB引擎层

一、redo log日志 接下来的两个日志,是innodb为解决不同问题而引出的两类日志文件。 redo log(重做日志)的设计主要是为了防止因系统崩溃而导致的数据丢失,其实解决因系统崩溃导致数据丢失的思路如下: 1、每次提交事务…

SpringBoot解决用户重复提交订单(方式二:通过Redis实现)

文章目录 前言1、方案实践1.1、引入Redis依赖1.2、添加Redis环境配置1.3、编写获取请求唯一ID的接口,同时将唯一ID存入redis 1.4、编写服务验证逻辑,通过 aop 代理方式实现1.5、在相关的业务接口上,增加SubmitToken注解即可 2、小结 前言 在…

华润数科、京东科技、京彩未来携手共进,求解“科技×产业”最大值

4月18日,华润数科、京东科技、京彩未来三方代表在中国深圳签署三方合作协议。面向产业数字化的市场机遇,华润数科物联网事业部总经理刘楚明先生表示,华润数科作为华润集团重点培育的数字科技业务单元,基于技术优势及资源整合能力&…

在SAP中使用QUERY

在SAP中使用QUERY 一、SAP query介绍 ​ QUERY是SAP提供的方便无编程基础用户的报表工具,使用图形化的界面,让用户托托拽拽就能轻松完成报表编写。我们可以将Query理解成QuickView的高级版本,它在QuickView的基础上增加的功能有&#xff1a…

一、摄影基础课

目录 第一章 控制曝光1. 曝光及曝光三要素1.1 曝光1.2 光圈1.3 快门1.4 感光度(ISO)1.5 曝光三要素之间的关系 2. 曝光模式3. 测光模式4. 曝光补偿 第二章 控制对焦1. 对焦区域2. 对焦模式 第三章 控制色彩 第一章 控制曝光 1. 曝光及曝光三要素 1.1 曝…

尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

视频地址:【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…

外包干了4年,直接废了···

有一说一,外包没有给很高的薪资,是真不能干呀! 先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了&#xff0…

[java/初学者]java常用API(1)——包装类

前言 在学习本课题之前,我们首先需要知道什么是API。 API,即Application Programming Interface,中文名称是“应用程序接口", 这些接口就是"jdk所提供"给我们使用的类,我们不需要去深究它是如何实现…

STM32+EC20实现4G无线通信

EC20是一款集成度非常高的4G无线通信模块,支持多种常见通信频段,能满足几乎所有的M2M(MachinetoMachine)应用需求。模块支持TCP/UDP/FTP等一众网络协议,内置多星座高精度定位GNSS接收机,快速提供准确的经纬度信息,UART…

vscode java环境扩展

下载安装jdk: Java Downloads | Oracle 下载安装maven: Maven – Download Apache Maven windows系统选择 Binary zip archive maven目录中的conf文件中有一个settins.xml文件 镜像&#xff08;mirrors&#xff09;二选一 <mirror><id>nexus-aliyun</…

影视动画设计有些SCI期刊推荐? - 易智编译EaseEditing

以下是几本影视动画设计方向的SCI期刊&#xff1a; ACM Transactions on Graphics: 该期刊是ACM&#xff08;Association for Computing Machinery&#xff0c;美国计算机协会&#xff09;下的一个子刊&#xff0c;涵盖了计算机图形学和交互技术等领域&#xff0c;也包括了动…

虚拟化技术 — 硬件辅助的虚拟化技术

目录 文章目录 目录硬件辅助的虚拟化技术概览CPU 虚拟化技术基于二进制翻译的全虚拟化技术&#xff08;Full-Virtualization&#xff09;需要改造 GuestOS 的半虚拟化技术&#xff08;Para-Virtualization&#xff09;Intel VT-x 硬件辅助的虚拟化技术&#xff08;Hardware-ass…

智芯Z20K11x串口printf重定向

智芯Z20K11x串口printf重定向 目录 智芯Z20K11x串口printf重定向前言1 串口代码编写2 Keil勾选MicroLIB库结束语 前言 智芯Z20K11x系列是基于ARM CORTEX M0的中低端微控制器&#xff0c;高达256K P FLASH 128K D FLASH&#xff0c;2路CANFD接口&#xff0c;4路UART/LIN接口&a…

综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…