【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分酒问题(DFS解法)

    分酒问题(DFS解法)题目大概是这样:已知有三个容量分别为3千克、5千克和8千克的并且是没有刻度的酒瓶,3千克和5千克的瓶子均装满了酒,而8千克的瓶子为空。现要求仅用这三个酒瓶将这些酒均分为两个4千克并分别装入5千克和8

    2022年7月2日
    32
  • python数据分析源码_python 统计分析

    python数据分析源码_python 统计分析以后都在github更新,请参考CpythonInternals版本第一步克隆Cpython仓库到本地,切换到我当前的版本,我当前的版本号是3.8.0a0gitclonehttps://github.com/python/cpython.gitgitreset–hardab54b9a130c88f708077c2ef6c4963b632c132b…

    2022年8月23日
    8
  • SQL Server 日期 字符串 格式转换 函数 datetime convert「建议收藏」

    SQL Server 日期 字符串 格式转换 函数 datetime convert「建议收藏」文章目录IntroSQLOthersIntro对某些表格数据进行查询时,常常有按照时间进行列值过滤的需求。SQLSQLServer内置函数CONVERT(data_type(length),data_to_be_converted,style)常见的两种转换需求:1.日期–>字符串2.字符串–>日期SQLselectgetdate(); –datetime–datetime–>stringdeclare@dateti

    2022年10月8日
    3
  • ICMP报文详解之ping实现「建议收藏」

    ICMP报文详解之ping实现「建议收藏」ping是向网络主机发送ICMP回显请求(ECHO_REQUEST)分组,是TCP/IP协议的一部分。主要可以检查网络是否通畅或者网络连接速度快慢,从而判断网络是否正常。ping命令底层使用的是ICMP,ICMP报文封装在ip包里。它是一个对IP协议的补充协议,允许主机或路由器报告差错情况和异常状况。ICMP报文格式和各个字段的含义…

    2022年5月8日
    48
  • horspool算法讲解_string匹配字符串

    horspool算法讲解_string匹配字符串Horsepool算法是Boyer-Moore算法的简化版本,这也是一个空间换时间的典型例子。算法把模式P和文本T的开头字符对齐,从模式的最后一个字符开始比较,如果尝试比较失败了,它把模式向后移。每次尝试过程中比较是从右到左的。假设文本中,对齐模式最后一个字符的元素是c,Horspool算法根据c的不同情况来确定移动距离,无论c是否和模式的最后一个字符相匹配。一般来说,会存在下面四种情况。情况1:看

    2022年8月21日
    5
  • TortoiseGit Couldn’t load this key(unable to open file)

    很小的问题,记录一下!在使用TortoiseGit 配置了ppk后,有一个Git仓库每次更新的时候都会提示下面的错误! Couldn’t load this key(unable to open file)如图:解决办法: 在对应的仓库下面右键 ,看到如下 , TortoiseGit_Gen_GitHub.ppk是我之前生成的,后来这个ppk删掉了,而…

    2022年2月27日
    52

发表回复

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

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