JVM内存回收策略

JVM系列之内存分配与回收策略 前言 经过前面几篇文章,我们已经对JVM虚拟机有了个初步认识,也了解了各区域应用哪些收集器,以及每个收集器用哪些收集算法,但是在这一系列过程中,其实就是一个对象的由生到死的过程,那么在这过程中对象是怎么处理它的生命周期的呢,今天我们就来介绍下对象在内存中的分配和回收分配给对象的内存,那么,让我们带着愉快的周末心情来开启今天的JVM之旅吧。 内存分配 内存分配,通俗讲就是对象在堆上分配:对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数对象也可能直接. 阅读详情

对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程有限分配在TLAB上。少数情况下也可能会直接分配在老年代。

内存分配策略:

对象优先在Eden分配

大多数情况情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。
注:新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java队形大多都是具备朝生夕死的特性,所以MinorGC非常频繁,一般回收速度也比较快。(新生代采用复制收集算法。)
老年代GC(Major GC/Full GC):指发生在老年代的GC,出现Major GC,至少会伴随至少一次Minor GC。Major GC 一般会比Minor GC慢 10 倍以上。(复习:Full GC,采用标记——清除,或者标记——整理算法。)
例子:10M新生代,10M老年代,新生代中Eden区与一个Survivor区的空间比例是8:1,新生代可用空间为(Eden区+1个Survivor区=9M)。
程序按顺序分别分配3个2M对象,1个4M对象。在对第4个对象分配的时候会发生一次Minor GC,因为第4个对象4M剩余Eden区不足以分配,所以通过分配担保机制提前转移到老年代去。借此GC结束以后,4MB对象顺利分配在Eden中,Survivor空闲,老年代被占用6MB。

大对象直接进入老年代

大对象指大量需要连续内存空间的Java内存,典型如很长的字符串和数组。更糟糕的是有”朝生夕灭“的”短命大对象“,写程序的时候尽量避免。
可以设置对象大于某个值直接在老年代分配。-XX:PrentenureSizeThreshold参数。
目的是为了避免Eden区及两个Survivor区之间发生大量大的内存复制。

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

内存回收能识别哪些对象应放在新生代,哪些老年代。虚拟机给每个对象定义一个对象年龄(Age)计数器。在Eden出生并经过一次Minor GC后依然存活,并且能被Survivor容纳就移动到Survivor空间中,并且对象年龄设为1.对象在Survivor区中每”熬过“一次Minor GC,年龄就增加1岁,而它的年龄增加到一定程度(默认为15岁),就将它晋升到老年代中。年龄阈值可以设置–XX:MaxTenuringThreshold。

动态年龄判定

为了更好适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到设定的阈值MaxTenuringThreshold才能晋升到老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold要求的年龄了。

空间分配担保

在发生Minor GC之前,虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象总空间,如果成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机查看HandlePromotionFailure设置值是否允许晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC。尽管这次Minor GC是有风险的;如果小于,或者HandlePromotionFailure设置不允许冒险,那这时候也要该位进行一次Full GC。

Shell编程规范及变量 文章目录一.Shell脚本1.1Shell概述1.2Shell脚本 一.Shell脚本 1.1Shell概述 Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。 Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。 1.2Shell脚本 将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的 ... 阅读详情

相关推荐

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 956

深入理解JVM——内存分配和垃圾回收策略详解

经典垃圾收集器 Serial收集器 这个收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。“Stop The World”这个词语也许听起来很酷,但这项工作是由虚拟机在后台自动发起和自动完成的,在用户不可知、不可控的情况下把用户的正常工作的线程全部停掉,这对很多应用来说都是不能接受的。 迄今为止,它依然是HotSpot虚拟机运行在客户端模式下的默认新生

weixin_57323780的博客 568

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

你是否在STM32CubeIDE中遇到过这样的崩溃场景?——精心编写的中文注释在重新生成代码后变成“锟斤拷”乱码,不仅影响代码可读性,反复修改更是浪费大量时间!作为STM32开发者,我曾被这个问题困扰许久,试过修改软件设置、工程编码却始终治标不治本。直到发现这个基于Java环境变量的终极解决方案,才彻底解决了中文乱码难题。

smart_boy__的博客 2951

jvm内存分配与回收策略

jvm内存策略

打怪升级 1442

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3515

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5495

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

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

KEEP CODING 584

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。

TxNet 1751

Java虚拟机:内存分配与回收策略

概述Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,我们已经使用了大量篇幅去介绍虚拟机中的垃圾收集器体系以及运作原理,现在我们再一起来探讨一下给对象分配内存的那点事儿。对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果...

程序员囧辉 4025

OpenMM | PDBFixer 用于蛋白质预处理

PDBFixer 用于蛋白质预处理

DrugOne 3004

教你如何阅读Autosar代码(6):常量变量定义

编译器抽象应该为常量的声明和定义定义CONST宏。编译器抽象应该定义VAR宏来声明和定义变量。memclass:常量本身的分类;memclass:变量本身的分类;vartype:变量的类型;type:常量的类型;

wdconan001的博客 958

内存分配和回收策略简述

对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。 老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC

universe_ant的博客 854

Pytest教程:Pytest插件原理

Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。

旦莫的博客 636

JVM-内存分配与回收策略

JVM 规范中运行时数据区域中的方法区,在 HotSpot 虚拟机中也称为永久代(Permanet Generation),存放一些类信息、常量、静态变量等数据,当系统要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,会触发 Full GC。值是否设置为允许担保失败, 如果是,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小, 如果大于,将尝试进行一次 Minor GC,尽管这次 Minor GC 是有风险的;, 如果这个条件成立,Minor GC 可以确保是安全的;

Dc253061007的博客 1019

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM-内存分配策略和垃圾回收策略

目录对什么区域进行垃圾回收?什么情况下回收?四种引用:JVM内存分配策略:1.对象优先在Eden分配2.大对象直接进入老年代3.动态对象年龄判断4.长期存活的对象将进入老年代5.空间分配担保垃圾回收算法:1.标记-清除算法2.复制算法3.标记-整理法4.分代回收算法什么是STW?精确式GC:savepoint :安全点抢先式中断:主动式中断:安全区:垃圾收集器Serial收集器(新生代收集器)ParNew收集器(新生代收集器)Parallel Scavenge收集器(新生代收集器)Serial Old收集器

java_cG的博客 1069

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM 内存分配与垃圾回收策略

本文探讨JVM内存分配与垃圾回收策略,涵盖Eden区对象分配、大对象直接进入老年代、长存对象晋升、动态年龄判定及空间分配保证,还涉及堆结构、垃圾回收算法、JVM调优及应用实践,力求全面且易懂。

持续输出Java相关知识 796

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM内存分配与回收策略

JVM内存分配与回收策略1、回顾JVM垃圾收集2、自动内存管理3、Minor GC和Full GC介绍4、内存分配策略 1、回顾JVM垃圾收集 前面几篇博客主要讲了JVM的垃圾收集。 JVM垃圾收集(一):对象存活判断算法 JVM垃圾收集(二):垃圾收集算法 JVM垃圾收集(三):垃圾收集器 这篇博客介绍JVM内存分配与回收策略。 2、自动内存管理 一般自动内存管理包含以下两个内容。 其中的回收...

way2016的博客 319

JVM堆内存分区与垃圾回收策略

在深入探讨Java虚拟机(JVM)的内存管理机制之前,让我们先设想一个场景:一个大型企业级应用,它需要处理海量的用户数据,这些数据在业务逻辑处理过程中不断产生和消耗。然而,随着时间的推移,系统逐渐暴露出内存使用不当的问题。具体来说,由于堆内存的分配和管理不当,导致频繁的内存溢出错误,严重影响了系统的稳定性和性能。这种情况下,对JVM堆内存的深入理解显得尤为重要。JVM的堆内存是Java对象的主要存储区域,它负责存储几乎所有的Java对象实例以及数组。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 996

[JVM]-内存分配与回收策略

本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算法,各自的特点? HotSpot 为什么要分为新生代和老年代? 常见的垃圾回收器有那些? 介绍一下 CMS,G1 收集器。 Minor Gc 和 F...

oayoat blog 428

JVM调优实战 Day 3:内存分配与回收策略

本篇详细讲解了JVM内存分配与回收策略,包括内存分配机制、回收算法、常见问题及解决方案、调优策略和实战案例。我们通过理论与实践结合的方式,帮助读者理解JVM如何高效地管理内存资源,并在实际项目中应用这些知识。通过合理配置JVM参数、优化对象创建、选择合适的GC策略,可以显著提升Java应用的性能和稳定性。下一天我们将进入“JVM监控与诊断”专题,重点讲解JVM性能监控工具的使用方法和实战技巧,敬请期待!

在未来等你的专栏 904

分配策略_一文搞懂JVM垃圾回收和内存分配策略

JVM垃圾回收器和内存分配策略前言:程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生命「线程私有」,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,只有在程序处于运行期才知道那些对象会创建,这部分内存的分配和回收都是动态的,垃圾回收期所关注的就是这部分...

weixin_29091837的博客 239

java内存回收策略_JVM之内存分配与回收策略

JVM之内存分配与回收策略来源https://www.cnblogs.com/xiaoxi/p/6557473.htmlJVM分代垃圾回收策略的基础概念来源https://www.cnblogs.com/xiaoxi/p/6602166.html一、为什么要分代分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效...

weixin_29164185的博客 159

深入JVM学习之内存分配与回收策略

深入JVM学习之内存分配与回收策略 前言 Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存。回收内存之前已经介绍了虚拟机中的垃圾收集器体系以及运作原理,现在来介绍对象的内存分配。 GC和FullGC 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁...

dailingnan0827的博客 251

JVM垃圾回收以及内存分配策略

JVM垃圾回收以及内存分配策略 文章目录JVM垃圾回收以及内存分配策略计算对象存活的算法引用计数算法(Reference Counting)根搜索算法(GC Rooting Tracing)引用类型强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phanton Reference)对象的死亡与逃生永久代(方法区)的垃圾回收垃圾回收算法标记-清除(Mark-Sweep)复制(Copy)标记-整理(Mark-Compact)分代收集(

foolishboy_w的博客 293
上一篇: Heap分区和分代概念
下一篇: MinorGC or FullGC
jamespengo
博客等级 码龄16年 83粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值