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


相关推荐

  • docker(10)上传本地镜像到镜像仓库「建议收藏」

    docker(10)上传本地镜像到镜像仓库「建议收藏」前言之前通过docker搭建过jenkins+python3环境,如果想要在不同的机器上搭建一样的环境,就可以将之前搭建的镜像上传到镜像仓库,这样方便在不同的机器上快速搭建同一套环境。如果公开的话

    2022年8月6日
    5
  • HOG特征提取_模式识别图像处理算法有哪些

    HOG特征提取_模式识别图像处理算法有哪些图像处理之特征提取:HOG特征简单梳理HOG方向梯度直方图,这里分解为方向梯度与直方图。一、方向梯度梯度:在向量微积分中,标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。更严格的说,从欧几里得空间Rn到R的函数的梯度是在Rn某一点最佳的线性近似。在这个…

    2022年10月26日
    0
  • MYSQL EXPLAIN结果详解

    MYSQL EXPLAIN结果详解EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况。EXPLAIN不考虑各种Cache(缓存)。EXPLAIN不能显示MySQL在执行查询时所作的优化工作。部分统计信息是估算的,并非精确值。 EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。1idselect的识别符,这是select的查询序列号。如果有两列数据id相同,则为同一组查询,由上到下执行。如果id值不同,id值越大,优先级越高。2select_type

    2022年8月31日
    3
  • java 软连接_螺栓软连接与硬链接

    java 软连接_螺栓软连接与硬链接1.Linux链接概念Linux链接分两种,一种被称为硬链接(HardLink),另一种被称为符号链接(SymbolicLink)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(InodeIndex)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连…

    2022年9月30日
    0
  • idea安装mybatis插件_maven 插件

    idea安装mybatis插件_maven 插件MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括:Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setP

    2022年9月26日
    0
  • 2015年逻辑真题难度(2015年逻辑真题)

    说说你对数据库读写分离的理解读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。为什么要分库、分表、读写分?单表的数据量限制,当单表数据量到一定条数之后数据库性能会显著下降。数据多了之后,对数据库的读、写就会很多。分库减少单台数据库的压力。接触过几个分库分表的系统,都是通过主键进行散列分裤分表的。这类数据比较特殊,主键就是唯一的获取该条信息的主要途径。比如

    2022年4月18日
    31

发表回复

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

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