jvm内存分配与回收策略

杨铭宇 杨铭宇     2022-09-02     725

关键词:

对象优先在Eden分配

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

Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
Major GC/Full GC:老年代GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略中就有直接进行Major GC的策略选择过程)。Major GC的速度一般比Minor GC慢10倍以上。

大对象直接进入老年代

  • 大对象:需要大量连续内存空间的Java对象,最典型的大对象就是很长的字符串以及数组。
  • -XX:PretenureSizeThreshold参数可以设置,令大于这个设置值的对象直接在老年代分配,只对Serial和ParNew收集器有用。

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

  • 虚拟机给每个对象定义了一个对象年龄(Age)计数器。
  • 如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且能被Survivor容纳,将被移动到Survivor空间中,并且对象年龄设为1.
  • 对象在Survivor区中每经过一次Minor GC,年龄就增加1,当它的年龄到一定程度时(默认为15岁),将会晋升到老年代。
  • -XX:MaxTenuringThreshold设置阈值。

动态对象年龄判断

  • 如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要等到MaxTenuringThreshold中要求的年龄。

空间分配担保

    • 在发生Minor GC之前,虚拟机会先检查老年代最大可用连续空间是否大于新生代所以对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。
    • 若不成立,则查看HandlePromotionFailure设置值是否允许担保失败,若允许,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,则将尝试一次Minor GC,尽管有风险。若失败,则会进行一次Full GC。
    • 如果小于或者设置不允许冒险,那么这时要改为进行一次Full GC。
    • 一般都会将HandlePromotionFailure打开,避免Full GC太频繁。

jvm内存分配与回收策略

...致是Eden、FromSurvivor和ToSurvivor。划分的目的是更好地回收内存或更快地分配内存。根据JVM规范,Java堆可以处于物理上不连续的内存空间中,要求逻辑上连续。   1对象优先在Eden区中分配  大多数情况下,对象在新生代Eden... 查看详情

内存分配与回收策略

内存分配与回收策略  Java技术体系中的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存和回收分配给对象的内存。关于内存回收这一点,我们在Java垃圾收集机制中详细介绍了各种回收算法以及JVM中常见... 查看详情

jvm内存分配与回收策略

...致是Eden、FromSurvivor和ToSurvivor。划分的目的是更好地回收内存或更快地分配内存。根据JVM规范,Java堆可以处于物理上不连续的内存空间中,要求逻辑上连续。  1对象优先在Eden区中分配  大多数情况下,对象在新生代Eden区中... 查看详情

jvm学习十-(复习)内存分配与回收策略

内存分配与回收策略对象的内存分配,就是在堆上分配(也可能经过JIT编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的Eden区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的... 查看详情

jvm系列三:内存分配与回收策略

内存分配策略1、对象优先分配在新生代Eden区多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次MinorGC 2、大对象直接进入老年代大对象直接分配在老年代,避免新生代里出现从Eden到Survivor频繁的内存复制... 查看详情

jvm之内存分配与回收策略

前言   对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存... 查看详情

jvm学习十-(复习)内存分配与回收策略(代码片段)

内存分配与回收策略对象的内存分配,就是在堆上分配(也可能经过JIT编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的Eden区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的... 查看详情

jvm内存分配与回收策略

对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。MinorGC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多具备朝生夕灭的特性,所以MinorGC非... 查看详情

jvm系列jvm垃圾收集器与内存分配策略

众所周知,在java语言中,内存分配和回收是由jvm自动管理的。因此内存的分配和回收也是jvm三大功能之一。垃圾收集器(GC)需要完成三件事情:哪些内存需要回收?什么时候进行回收?如何回收?本篇博客将解答jvm是如何处理... 查看详情

jvm之gc日志分析与对象内存分配回收策略(代码片段)

GC日志分析与内存分配回收策略一.GC日志分析的引入二.GC的分类与GC日志结构剖析三.JDK1.9以前的日志分析四.JDK1.9以后的日志分析五.对象内存分配回收策略一.GC日志分析的引入🐬GC日志分析的重要性:阅读分析虚拟机和垃... 查看详情

jvm,深入理解java虚拟机,内存分配与回收策略(代码片段)

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,我们已经使用了大量篇幅去介绍虚拟机中的垃圾收集器体系以及运作原... 查看详情

jvm内存分配与回收

1.内存分配与回收策略内存自动管理:自动化的解决了对象内存分配和回收对象内存的问题。一般在堆上分配对象,也可能经过JTI编译后间接在栈上分配。主要分配在新生代的Eden区,如果启动了本地线程分配缓冲(线程缓冲区TLA... 查看详情

java虚拟机序列java中的垃圾回收与内存分配策略

...】java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略。垃圾回收(GarbageCollection,GC)是java语言的一大特色,在J... 查看详情

jvm-内存分配与回收策略

  JAVA技术体系中的自动内存管理实际上就是自动化的解决了给对象分配内存以及回收给对象分配的内存这两个问题。回收部分通过之前的《GC设计思路分析》和《垃圾收集器》这两篇博文进行了总结,那么接下来主要就是谈... 查看详情

jvm-垃圾收集器与内存分配策略

判断对象是否存活引用计数法:强引用->软引用(内存溢出异常前第二次回收)->弱引用->虚引用可达性分析算法:一个对象到GCRoots没有任何引用链(ReferenceChain),则证明此对象不可用无用的类标准该类所有的实例都已回收... 查看详情

《深入理解jvm——gc算法与内存分配策略》

 JVM深入理解JVM(2)——GC算法与内存分配策略 PostedbyCrowonAugust10,2017说起垃圾收集(GarbageCollection,GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行... 查看详情

《深入理解jvm——gc算法与内存分配策略》(代码片段)

 JVM深入理解JVM(2)——GC算法与内存分配策略 PostedbyCrowonAugust10,2017说起垃圾收集(GarbageCollection,GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行... 查看详情

深入理解_jvm内存管理内存分配和回收策略06

解决两个问题:   1、对象分配内存;   2、回收分配给对象的内存。本节详细讲解分配的问题:名词解释:新生代GC(MinorGC):指发生在新生代的垃圾回收动作,非常频繁,回收速度很快。老生代GC(MajorGC/FullGC)... 查看详情