【007】【JVM——内存分配和恢复策略】

【007】【JVM——内存分配和恢复策略】

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。



内存分配与收回策略

JVM的自己主动内存管理要自己主动化地解决两个问题:对象分配内存以及回收分配给对象的内存。回收内存前几篇已经讲了。如今说内存分配。对象的内存分配一般分配在堆内存中,也可能经过JIT 编译后被拆散为标量类型间接地在栈上分配。对象主要分配在新生代的Eden 区上,假设启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配。

少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,与使用哪一种垃圾收集器组合,还与虚拟机中内存相关參数设置有关。

对象优先在Eden区分配

多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC

  • 新生代GC (MinorGC):新生代的垃圾收集动作, Java 对象大多生命短,所以MinorGC 很频繁,速度也比較快。

  • 老年代GC ( MajorGC或者FullGC):老年代的垃圾收集动作,出现了MajorGC ,常常会伴随至少一次的MinorGC (非绝对的。在ParallelScavenge 收集器的收集策略中就有直接进行MajorGC的策略选择过程)。MajorGC的速度一非常会比MinorGC慢10倍以上。


大对象直接进入老年代

大对象就是须要大量连续内存空间的Java对象。最典型的大对象就是那种非常长字符串及大数组。

-XX : PretenureSizeThreshold 參数能够设置值大对象直接在老年代中分配。避免垃圾回收时在Eden 区及两个Survivor 区之间发生大量的内存拷贝。

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

虚拟机分代收集的方法管理内存,在内存回收时就必须能识别哪些对象应当放在新生代,哪些对象应放在老年代中。

虚拟机给每一个对象定义了一个对象年龄( Age )计数器。假设对象在Eden 出生并经过第一次MinorGC后仍然存话,而且能被Survivor容纳的话,将被移动到Survivor 空间中,并将对象年龄设为1。

对象在Survivor 区中每熬过一次Minor GC,年龄就添加1岁。 当年龄添加到一定程度(默觉得15 岁〉肘。就会被晋升到老年代中。对象晋升老年代的年龄阈值,能够通过參数-XX:MaxTenuringTbreshold 来设置。

动态对象年龄判定

为了能更好地适应不同程序的内存状况,虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold 才干晋升到老年代,假设在Survivor 空间中同样年龄全部对象大小的总和大于Survivor 空间的一半,年龄大于或等于该年龄的对象就能够直接进入老年代,无须等到MaxTenuringThreshold 中要求的年龄。

空间分配担保

在发生MinorGC 肘,虚拟机会检測之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小。假设大于,则改为直接进行一次FullGC 。

假设小于。则查看HandlePromotionFailure 设置是否同意担保失败:假设同意,那仅仅会进行MinorGC :假设不同意,它会被更换一次FullGC

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络协议学习–SOAP协议(一)

    网络协议学习–SOAP协议(一)学习了soap协议,介绍了关键的组成部分,rpc,http协议,xml,wsdl文件,以及用postman模拟soap进行测试。

    2022年7月15日
    15
  • java中数组的最大下标是_c语言中数组下标从几开始

    java中数组的最大下标是_c语言中数组下标从几开始packagepractice;publicclassExtremeValueAndIndex{ publicstaticvoidmain(String[]args){ intnumberArr[]={7,3,5,1,8,4}; intmax=numberArr[0],min=numberArr[0]; intmaxIndex=0,minIndex=0; for(inti=1;i<numberArr.

    2022年10月11日
    1
  • linux系统管理初学者指南 基于centos 7.6下载_centos查看运行的进程

    linux系统管理初学者指南 基于centos 7.6下载_centos查看运行的进程目录一、进程概念1.进程组成部分:2.僵尸进程:3.线程:4.上下文切换:5.中断处理:6.进程的属性二、ps查看进程工具1.-aux弹出消息及详解2、linux进程有5种基本状态三、free查看内存使用情况1.弹出消息及详解:三、uptime查看系统负载1.弹出消息含意如下:四、top命令动态性能分析工具1.每行信息2.top快捷键:五、lsof命令用于查看你进程调用、打开的文件六、kill关闭进程1)ki

    2025年9月5日
    6
  • session.setAttribute()方法

    session.setAttribute()方法session.setAttribute(“sessionName”,Object);用来设置session值的,sessionName是名称,object是你要保存的对象。session.getAttribute(“sessionName”);用来得到对应名称的session值,即得到object对象,注意需要进行类型转换!session.setAttribute(“xyyyy”,xyyy);保存session.getAttribute(“xyyyy”);取得你可以把自己要的数据什么的放在se

    2022年10月17日
    2
  • if python用法_for循环语句

    if python用法_for循环语句今天,我们将学习Python中if语句的基本使用。if在Python中用作某个条件或值的判断,格式为:if条件: 执行语句1else: 执行语句2else是当条件不成立时运行的代码。我们先来看个例子,程序判断天气情况并输出是否要带伞:weather=input(“今日天气是:”)ifweather==”雨天” print(“今天出门需要带伞”)else: print(“今天出门不需要带伞”)运行代码,输入雨天会提示要带伞。if语句中用的两个“=”是什么呢

    2022年9月26日
    2
  • Java课程设计—中国象棋(源代码及视频)「建议收藏」

    谢谢大家的支持,您的一键三连是罡罡同学前进的最大动力!一键三连一键三连一键三连一键三连一键三连一键三连传送地址数据结构课程设计——校园导游系统(C语言):B站视频:https://www.bilibili.com/video/BV1ui4y137X9CSDN源码:https://blog.csdn.net/m0_46625346/article/details/107149473Java课程设计——中国象棋B站视频:https://www.bilibili

    2022年4月8日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号