返回顶部
首页 > 资讯 > 后端开发 > Python >解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC
  • 282
分享到

解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC

2024-04-02 19:04:59 282人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录对象内存分配与回收策略对象何时进入新生代、老年代三种GC介绍MinorGCMajor GC/Full GC:图示GC过程对象内存分配与回收策略 对象的内存分配,往大方向讲,就是在

对象内存分配与回收策略

对象的内存分配,往大方向讲,就是在堆上分配〔但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中。

对象优先分配在Eden区,当Eden区可用空间不够时会进行MinorGC

大对象直接进入老年代:大对象即需要大量连续内存空间的对象(例如很长的字符串数组)。虚拟机提供了一个-XX:PretenureSizeThreshoId参数,令大于这个设置值的对象直接在老年代分配,这样做的目的是避免在Eden区及两个区之间发生大量的内存复制。注意PretenureSizeThreshoId参数只对Serial和ParNew两款收集器有效。

长期存活的对象将进入老年代:虚拟机给每个对象定义了一个对象年龄(Age)计数器(存在于对象头中)。如果对象在Eden出生并经过第一次MinorGC后仍然存活,并且能被Survivor容纳的话,将被移动到Survwor空间中,并且对象年龄设为1。对象在Survivor区中每“熬过”一次MinorGC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshoId设置。

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

空间分配担保:在发生Minor GC之前,虚拟机会先检查Survivor空间是否够用,如果够用则直接进行Minor GC。否则进行检查老年代最大连续可用空间是否大于新生代的总和,假如大于,那么这个时候发生Minor GC是安全的。假如不大于,那么需要判断HandlePromotionFailure设置是否允许担保失败。假如允许,则继续判定老年代最大可用的连续空间是否大于平均晋升到老年代对象的平均值,如果大于,这个时候可以发生Minor GC ,如果小于或者设置HandlePromotionFailure不允许担保失败,则需要做一次Full GC。通常会把HandlePromotionFailure开关打开,以减少Full GC。

对象何时进入新生代、老年代

新分配的对象一般是直接进入新生代的。但是如果出现以下的情况,会让对象进入老年代。

  • 1.新分配的对象占用空间大于-XX:PretenureSizeThreshold时直接分配到老年代
  • 2.MinorGC的时候,Survivor中的内存不足了,允许分配担保时会进入老年代。
  • 3.MinorGC的时候,对象的年龄大于-XX:MaxTenuringThreshold(默认为15)时,进入老年代。对象年龄存在于对象头中,占4bit。
  • 4.当进行MinorGC的时候,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进人老年代。

三种GC介绍

MinorGC

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,也叫Young GC。因为Java对象大多具备朝生夕死的特征,所以MinorGC非常频繁,一般回收速度也比较快。一般采用复制算法

Minor GC触发条件

  • Eden区域满了
  • 新生对象需要分配到新生代的Eden,当Eden区的内存不够时需要进行MinorGC

Major GC/Full GC:

MajorGC:是清理老年代,Major GC发生过程常常伴随一次Minor

FullGC:Full GC可以看做是Major GC+Minor GC共同进行的一整个过程,是清理整个堆空间(包括年轻代和老年代,这里不包含永久代,因为永久代在jdk7之前包含方法区,是一块与堆分离的区域;JDK7将静态变量从永久代移到堆中;JDK8则完全取消永久代,方法区存在元空间MetaSpace中,虽然与堆共享一块内存,逻辑上可以认为在堆中,但仍然与堆不相连)。Full GC的速度一般会比 Minor GC慢10倍以上。一般用的是标记整理和标记清除算法

Full GC触发条件

  • 上面Minor GC时介绍中Survivor空间不足时,判断是否允许担保失败,如果不允许则进行Full GC。如果允许,并且每次晋升到老年代的对象平均大小>老年代最大可用连续内存空间,也会进行Full GC。
  • MinorGC后存活的对象超过了老年代剩余空间
  • 方法区内存不足时
  • System.gc(),可用通过-XX:+ DisableExplicitGC来禁止调用System.gc
  • CMS GC异常,CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent Mode Failure”失败,会触发Full GC

图示GC过程

1:初始阶段,对象分配在Eden区(大对象直接进入老年代,通过-XX:PretenureSizeThreshold配置),此时S0和S1是空的(圆圈中的数字代表对象的年龄)

2:当Eden区满了之后,进行MinorGC,经过扫描与标记,不再存活的对象被清除,存活的对象进入Survivor中的S0并且对象年龄+1,此时Eden被清空,S1是空的

3:然后随着对象增多又一次MinorGC后,Eden区和S0区存活的对象进入S1区并且对象年龄+1,Eden和S0区被清空

4:又一次MinorGC后,和上面步骤类似,Eden区和S1区存活的对象进入S0区并且对象年龄+1,Eden和S1区被清空

5:对象每熬过一次MinorGC其年龄就会加1,达到年龄阈值(可通过参数-XX:MaxTenuringThreshold配置)的年轻代对象会晋升到老年代,随着进入老年代的对象越来越多,当老年代内存不够用时会发送MajorGC。

到此这篇关于解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC的文章就介绍到这了,更多相关Java 内存分配 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC

本文链接: https://lsjlt.com/news/136534.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC
    目录对象内存分配与回收策略对象何时进入新生代、老年代三种GC介绍MinorGCMajor GC/Full GC:图示GC过程对象内存分配与回收策略 对象的内存分配,往大方向讲,就是在...
    99+
    2024-04-02
  • Java内存分配与回收策略
    本篇内容介绍了“Java内存分配与回收策略”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内存分配与回收策略Minor GC 和 Full G...
    99+
    2023-06-02
  • 深入了解java内存分配和回收策略
    一、导论java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配。通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的E...
    99+
    2023-05-31
    java 内存分配 回收策略
  • redis 过期策略及内存回收机制解析
    目录1. 过期策略1.1 过期的 key 集合1.2 定时扫描策略1.3 从库的过期策略2. 懒惰删除2.1 异步线程2.2 flush2.3 异步队列2.4 AOF Sync很慢的...
    99+
    2024-04-02
  • 分析Go语言中的内存分配与回收策略
    Go语言中的内存分配与回收策略主要由Go语言的垃圾回收器(GC)负责。以下是Go语言中的内存分配与回收策略的一些特点:1. 基于标记...
    99+
    2023-10-12
    Go语言
  • Java虚拟机中内存分配与回收策略的示例分析
    小编给大家分享一下Java虚拟机中内存分配与回收策略的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配与回收策略Java技术体系的自动内存管理,最根...
    99+
    2023-06-25
  • 详解Java 虚拟机(第⑥篇)——内存分配与回收策略
    一、Minor GC 和 Full GCMinor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC...
    99+
    2023-06-05
  • redis 过期策略及内存回收机制的示例分析
    这篇文章主要介绍了redis 过期策略及内存回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。redis作为缓存的场景下,内存淘汰策略决定的redis的内存使用...
    99+
    2023-06-25
  • Java虚拟机内存分配与回收策略问题精细解读
    本文参考于《深入理解Java虚拟机》 内存分配与回收策略 Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存。 1. ...
    99+
    2024-04-02
  • java垃圾收集器与内存分配策略详解
    目录1.经典垃圾收集器1.1 Serial收集器1.2 ParNew收集器1.3 Parallel Scavenge 收集器1.4 Serial Old 收集器1.5 Paralle...
    99+
    2024-04-02
  • 优化Go语言应用程序的内存分配与回收策略
    优化Go语言应用程序的内存分配与回收策略可以提高程序的性能和效率。下面是一些优化策略:1. 减少内存分配:避免频繁的内存分配可以减少...
    99+
    2023-10-12
    Go语言
  • JVM内存管理深入垃圾收集器与内存分配策略的示例分析
    这篇文章给大家介绍JVM内存管理深入垃圾收集器与内存分配策略的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出...
    99+
    2023-06-17
  • 详解CLR的内存分配和回收机制
    一、CLR CLR:即公共语言运行时(Common Language Runtime),是中间语言(IL)的运行时环境,负责将编译生成的MSIL编译成计算机可以识别的机器码,负责资源...
    99+
    2024-04-02
  • 如何解决js数据类型和引用类型以及深浅拷贝和内存分配问题
    本篇文章给大家分享的是有关如何解决js数据类型和引用类型以及深浅拷贝和内存分配问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。js 深浅拷贝...
    99+
    2024-04-02
  • 一个分析和解决Java应用程序内存浪费的实战例子,值得收藏!
    内存是当今世界上被广泛浪费的硬件资源之一。由于编程效率低下,惊人量的内存浪费被浪费了。这种模式在多个企业应用程序中重复出现。为了证明这种情况,我们进行了一项小型研究。...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作