美文网首页JVM
2.HotSpot几条普遍的内存分配规则

2.HotSpot几条普遍的内存分配规则

作者: 幽游不想吃饭 | 来源:发表于2018-10-10 14:26 被阅读0次

目录

  • 概述
  • 对象优先在Eden分配
  • 大对象直接进入老年代
  • 长期存活的对象将进入老年代
  • 动态对象年龄判定
  • 空间分配担保

概述

自动内存管理归根结底来说分为两方面:给对象分配内存回收分配给对象的内存。本文主要介绍几条Java虚拟机中自动内存分配及回收的主要规则
阅读之前,需要知道两个概念:Minor GC和Full GC

Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。

Full GC(Major GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

对象优先在Eden分配

大多数情况,对象优先在Eden区进行分配,当Eden区空间不够分配对象时,虚拟机将发起一次Minor GC

大对象直接进入老年代

大对象指的是需要大量连续内存空间的Java对象(比较典型的就是很长的字符串以及数组)。对于Serial和ParNew两款收集器提供了-XX:PretenureSizeThreshold参数,令大于这个值的对象直接进入老年代。

目前jdk1.8默认的收集器Parallel Scavenge不支持此参数。如果需要这个参数,建议使用ParNew+CMS

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

虚拟机对每一个对象定义了一个对象年龄计数器,当对象第一次经历Minor GC时,对象从Eden区进入Survivor区,此时对象年龄记做1。对象在Survivor区每经历一次Minor GC,年龄增加1岁。当对象达到进入老年代年龄的程度时(默认15岁),对象晋升到老年代。通过-XX:MaxTenuringThreshold设置晋升到老年代的年龄阈值。

动态对象年龄判定

除了通过设置晋升老年代的年龄阈值来判定对象是否进入老年代之外,当某个年龄的所有对象所占内存总和大于Survivor空间的一半,那么,大于等于这个年龄的对象会直接进入老年代

空间分配担保

年轻代GC采用复制算法(当Eden和其中一个Survivor区中的存活对象复制到另一个Survivor区)进行GC回收时,当其中一个Survivor区不足以容纳存活的对象,就需要老年代提供内存空间来存放Survivor区无法容纳的多出来的对象。这就是担保的概念。
这时候有一个问题:我们无法在对象回收前得知有多少对象会存活下来。如果每次我们为了确保老年代空间能完全容纳新生代GC后幸存的对象,就需要每次都进行Full GC,但是每次都进行Full GC耗时过长而导致停顿时间增长,用户体验很不好。
针对这种情况,虚拟机采用的方法是:在垃圾回收之前,取之前每一次回收晋升到老年代的对象容量的平均大小作为参考,老年代剩余空间大于这个值或者大于新生代对象总大小则进行Minor GC,小于这个值则进行Full GC。虽然这样仍然会出现“担保失败”的情况,但是避免了过于频繁的Full GC。

相关文章

  • 2.HotSpot几条普遍的内存分配规则

    目录 概述 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担...

  • JVM内存分配

    探索堆内存到底是怎么分配 简介:堆内存分配方式,分配规则讲解 Java堆内存区域的划分以及作用讲解 对象分配的规则...

  • jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

    对象分配规则 堆内存: 分配策略: 1、jvm内存宏观分配策略 虚拟机栈分配<<<<<传送门 2、堆内分配策略 1...

  • iOS底层探究 - 内存对齐

    目录1:内存对齐的原因2:内存对齐的规则3:结构体内存分配演练以及在iOS中对象成员的内存分配探索 一 :内存对齐...

  • 《深入理解Java虚拟机》(二)--垃圾收集器与内存分配策略(4

    内存分配与回收策略 对象的内存分配规则不是固定的,是取决于你使用的是哪种垃圾回收器组合和虚拟机中的内存参数,如果启...

  • jvm内存结构

    主要关注点: jvm内存结构都是什么 对象分配规则 jvm内存结构 方法区和堆是所有线程共享的内存区域;而java...

  • (二)C语言之动态内存分配

    (二)C语言之动态内存分配 一、静态内存分配 定义是指定分配的内存长度就是静态内存分配,是在栈内存中分配 二、C语...

  • 《C语言》malloc函数使用

    动态分配、静态分配 静态分配:计算机随机自动分配内存,周期结束后自动释放内存动态分配:手动分配内存,手动释放内存 ...

  • javascript内存管理

    内存声明周期 分配你所需要的内存 使用分配的内存(读写) 不再需要时释放内存 内存分配 javascript在声明...

  • iOS结构体内存分配方式探究

    iOS结构体内存大小分配遵循以下几条原则:*结构体大小是其内部变量中最大内存变量的整数倍*结构体内部变量的属性的起...

网友评论

    本文标题:2.HotSpot几条普遍的内存分配规则

    本文链接:https://www.haomeiwen.com/subject/txzvoftx.html