JVM原理(七):JVM虚拟机的内存分配与回收策略

news2024/10/7 3:19:09

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

1. 对象优先在Eden分配

参数解释
-Xms初始堆大小
-Xmx最大堆大小
-XX:NewSize=n设置年轻代大小
-XX:NewRatio=n设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n设置持久代大小
-Xmn2G设置年轻代大小为2G。
-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;

1. 为什么要有Survivor区?
        设置Sunivor区的意义在哪里?如果没有Sunivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着MinorGc,也可以看做触发了Ful GC)。老年代的内存空间远大于新生代,进行一次Fu GC消[的时间比Minor GC长得多,频发的FUI! GC消耗的时间是非常可观的,这一点会形响理序的执行和响应速度,Sunivor的存在意义:就是减少被送到老年代的对象,进而减少Fu GC的发生,Suryvor的颈筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
2. 为什么要设置两个Survivor区?
        设置两个Sunivor区最大的好处就是解决了碎片化,为什么一个Sunivor区不行?假设现在只有一个sunior区:刚刚新建的对象在Eden中,一旦Eden满了,触发一次Minor Gc,Eden中的存活对象舰会被移动到Suivor区,这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Sunivor各有一些存活对象,如果此时把Edon区的存活对象硬放到Sunivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。碎片化带来的风险是极大的,堆中没有足够大的连续内存空间,无法为一个内存需求很大的对象分配内存。所以应该建立两块Sunvor区,刚刚新建的对象在Eden中,经历一次Minor GCc,Eden中的存活对象就会被移动到S0,Eden被清空;等Eden区再满了,就再触发一次Mnor GC,Eden和S0中的存活对象又会被复制送入第二块S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Edon两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。

package 内存分配与回收策略;
​
/**
 * @author:左泽林
 * @date:日期:2021-09-29-时间:21:06
 * @message:
 */
public class demo3_7 {
   private static final int _1MB = 1024*1024;
​
    public static void main(String[] args) {
        byte[] allocation1,allocation2,allocation3,allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];
    }
}
我们可以看到对象优先在新生代分配,新生代内存已满了之后,会分配在老年代里面

2. 大对象直接进入老年代

        大对象就是指需要大量连续内存空间的Java对象,最典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组,本节例子中的byte[]数组就是典型的大对象。比遇到大对象更恐怖的就是遇到一个朝生夕灭的‘短命大对象’,我们写程序的时候需要避免。除此之外,大对象往往会触发内存分配,来进行分配他们,这就意味着高额的内存复制开销。

设置参数:

-verbose:gc
-Xms20M
-Xmx20M
-Xmn10M
-XX:+PrintGCDetails
-XX:SurvivorRatio=8
-XX:PretenureSizeThreshold=3145728
public class demo3_8 {
    private static final int _1MB = 1024*1024;
​
    public static void main(String[] args) {
        byte[] allocation;
        allocation = new byte[9 * _1MB];
    }
}

分配的数据会直接分配到老年代。

3. 长期存活的对象进入老年代

        对象分配新生代和老年代的分配规则:

        为做到这点,虚拟机给每个对象定义了一个对象年龄(Age) 计数器,存储在对象头中(详见第2章)。对象通常在Eden区里诞生,如果经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,该对象会被移动到Survivor空间中,并且将其对象年龄设为1岁。对象在Survivor区中每熬过一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15),就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数==-XX:MaxTenuringThreshold==设置。

4. 动态对象年龄判定

        HotSpot虚拟机并不是永远要求对象的年龄必须达到==-XX: MaxTenuringThreshold==才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

5. 空间分配担保

        在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。

        如果不成立,则虚拟机会先查看-XX: HandlePromotionFailure参数的设置值是否允许担保失败( Handle Promotion Failure) ;

        如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。

        如果大于,将尝试进行一次M inor GC,尽管这次M inor GC是有风险的;

        如果小于,或者-XX:HandlePromotionF ailure设置不允许冒险,那这时就要改为进行一次Full GC。

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

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

相关文章

JavaScript常见数组方法的详细用法及示例

1.filter():检测数值元素&#xff0c;并返回符合条件所有元素的数组(具体要符合什么条件的的元素的函数方法需要我们自己去写)。示例如下 </head> <body><button id"but" onclick"test(arr)">点击出结果</button><div id"…

【开源合规】开源许可证基础知识与风险场景引入

文章目录 什么是开源许可证(License)?开源许可证有什么用?开源许可证分类开源许可证分类及描述公共代码 (Public Domain)CC0无License宽松型许可证 (Permissive)MITApache 2.0BSD弱互惠型许可证 (Weak Copyleft)LGPLMPLEPL互惠型许可证 (Reciprocal)GPLEUPL强互惠许可证 (Str…

Redis缓存管理机制

在当今快节奏的数字世界中&#xff0c;性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用&#xff0c;它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间&#xff0c;从而减少系统的延迟。Redis 是一种…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列&#xff08;针对工厂泛滥&#xff09;(**分类**)4.3 产品规划&#xff08;**数据模型**&#xff09;4.4 生产线规划&#xff08;**工厂类**&#xff09;4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…

51单片机点亮第一个LED灯

欢迎入群共同学习交流 时间记录&#xff1a;2024/7/2 一、电路原理图 二、代码程序 1.项目代码结构 2.主程序代码 #include <reg51.h>sbit ledP1^0;void delay(int ms) {int i0;while(ms--){for(i0;i<110;i);} }int main() {while(1){led 1;delay(1000);led 0;d…

Retrofit源码阅读

动态代理在 Android 中的应用&#xff1a;Retrofit 源码解析 在之前的文章 《Andriod 网络框架 OkHttp 源码解析》 中我们分析了 OkHttp 的源代码。现在我们就来分析一下 OkHttp 的兄弟框架 Retrofit。关于 Retrofit 的注解的使用&#xff0c;可以参考其官方文档&#xff1a;h…

镜像私服Harbor 2.0安装-探索工厂模式:如何优化Harbor项目管理与API集成

文章目录 一、docker-compose1. 下载 Docker Compose&#xff1a;2.添加执行权限&#xff1a;3.验证安装 二、安装harbor 2.01.下载harbor离线包2. 根据需求配置 Harbor3.给harbor创建SSL证书4.预编译harbor5. 安装并启动 Harbor (必须到你安装的目录) 三、登录harbor的web页面…

Java UU跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H5+公众号跑腿系统

&#x1f680;【同城生活小助手】&#x1f680; &#x1f3c3;‍♂️【同城跑腿&#xff0c;即刻送达的便利生活】&#x1f3c3;‍♀️ 在快节奏的都市生活中&#xff0c;时间成了最宝贵的资源。UU跑腿小程序&#xff0c;作为同城生活的得力助手&#xff0c;让你轻松解决生活…

208.贪心算法:买卖股票的最佳时机||(力扣)

代码解决 class Solution { public:int maxProfit(vector<int>& prices) {int result 0; // 初始化结果为0&#xff0c;表示初始利润为0// 从第二天开始遍历价格数组for (int i 1; i < prices.size(); i) {// 如果当天价格比前一天价格高&#xff0c;则将差价加…

学习伦敦金技术分析的具体步骤是什么?

技术分析是我们分析伦敦金市场的重要工具&#xff0c;刚入市就面对时涨时跌的市场应该如何交易呢&#xff1f;投资者如果不掌握技术分析的方法&#xff0c;恐怕对这个问题会没有头绪。入场都没有&#xff0c;盈利就更加无从谈起了。而学习技术分析&#xff0c;是有不同的阶段、…

算法-位图与底层运算逻辑

文章目录 1. 位图的理论基础2. 完整版位图实现3. 底层的运算逻辑-位运算 1. 位图的理论基础 首先我们要理解什么是位图, 位图的一些作用是什么 位图法就是bitmap的缩写。所谓bitmap&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于大规模数据&#xff0c;但数据状态又…

让你500平的大别墅网络信号无死角!一文读懂什么是Mesh

最新的路由器往往拥有超快的速度、多天线和对最新Wi-Fi标准的支持。然而&#xff0c;如果你的设备信号微弱或有死角&#xff0c;再强大的路由器也无济于事。虽然Wi-Fi扩展器是增加网络覆盖范围的廉价替代品&#xff0c;但它们效率低下且带宽较低。 相比之下&#xff0c;Mesh网络…

野外/工地车流计数摄像头,单人即可安装,简单低成本

在野外或工地这样的特殊环境中&#xff0c;对车流进行准确计数对于交通管理、资源调配以及安全保障都具有重要意义。而野外/工地车流计数摄像头的出现&#xff0c;以其单人即可安装、简单低成本的特点&#xff0c;为解决这些场景中的车流统计问题提供了理想的解决方案。 一、野…

【Elasticsearch】一、概述,安装

文章目录 概述全文搜索引擎概述ES&#xff08;7.x&#xff09; 安装ES&#xff08;Docker&#xff09;测试&#xff0c;是否启动成功 可视化工具配置中文 客户端Postman下载 概述 ES是开源的高扩展的分布式全文搜索引擎&#xff0c;实时的存储、检索数据&#xff1b;本身扩展性…

做了个记录心情并结合AI给出建议的小程序

名称&#xff1a;心情记录员 微信小程序名称叫程序记录员&#xff0c;主要功能是记录情绪&#xff0c;然后根据情绪和产生情绪的原因通过AI给出有助于心理健康的建议。同时支持统计功能&#xff0c;可以以查看日历的方式浏览不同日期下情绪的变化轨迹。 主要功能 记录情绪和…

“私域流量:解锁电商新机遇,共创数字化未来“

一、私域流量的战略意义再探 步入数字化浪潮的深处&#xff0c;流量已成为企业成长不可或缺的血液。与广泛但难以掌控的公域流量相比&#xff0c;私域流量以其独特的专属性和复用潜力&#xff0c;为企业铺设了通往深度用户关系的桥梁。它不仅赋能企业实现精准营销&#xff0c;…

应用监控SkyWalking调研

参考&#xff1a; 链路追踪( Skyworking )_skywalking-CSDN博客 企业级监控项目Skywalking详细介绍&#xff0c;来看看呀-CSDN博客 SkyWalking 极简入门 | Apache SkyWalking 使用 SkyWalking 监控 ClickHouse Server | Apache SkyWalking https://zhuanlan.zhihu.com/p/3…

主播一般用什么麦克风?一文看懂哪种麦克风降噪效果好

如今是一个短视频飞速发展的时代&#xff0c;越来越多自媒体人通过短视频的方式来进行直播带货、生活Vlog、线上K歌等&#xff0c;记录下生活里那美丽的瞬间。不过想要拍摄出来的视频作品拥有清晰的音质以及不受环境噪音所影响&#xff0c;那么一款好的麦克风是必不可少的。很多…

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…

如何选择最适合您的短剧系统源码

短剧系统源码是一个帮助用户搭建短剧平台的软件程序。在选择短剧系统源码时&#xff0c;确保选择一个适合您需求的系统是非常重要的。以下是一些关键因素&#xff0c;可以帮助您选择最好的短剧系统源码。 1. 功能丰富性&#xff1a;在选择短剧系统源码之前&#xff0c;您需要明…