当前位置: 首页 > 网络应用技术

Java内存分配和回收策略

时间:2023-03-06 12:00:10 网络应用技术

  对象的内存分布分配在堆上(也许在JIT编译后可以拆卸并间接分配其在堆栈上分配)。分布规则未固定,取决于当前的垃圾收集器组合和相关参数配置。

  这是最常见的内存分配规则。

  在大多数情况下,物体分配在伊甸园的新一代中。当伊甸园没有足够的空间分配空间时,虚拟机将启动次要GC。

  小型GC与主要GC/Full GC:

  在JVM规范中,均未正式定义少校GC和全GC,因此有些人也只是认为大型GC清理了老年,并且全GC清理了整个内存鸽子。

  大对象是指需要大量连续存储空间(例如长字符串或数据)的Java对象。大型对象可以保存到伊甸园区域的概率相对较小,并且分配保证的可能性相对较大。分配保证需要大量复制,这将导致低效率。

  虚拟机提供了一个参数,该参数比在老年中直接分配的对象更大。这样做的目的是避免伊甸区和两个幸存者区域之间的大量记忆复制。(您记得,新一代使用复制算法来回收垃圾)

  JVM定义了每个对象的对象年龄计数器。当新一代发生次要GC时,幸存对象的年龄为+1,当年龄超过某个值时,所有超过该值值的对象都会转移到老年。

  使用新一代最大的年龄,只要新一代的新一代超过参数将转移到老年。

  如果在当前的新一代幸存者中,同一年龄的所有对象的总大小大于幸存者空间的一半,并且年龄> =该年龄的对象可以直接进入旧一代而无需等待所需的年龄。

  JDK 6更新之前的规则24是:

  在次要GC发生之前,虚拟机会首先检查老年最大的连续空间是否大于新一代所有物体的总空间。如果建立了这种情况,则辅修GC可以确保其安全;如果未建立,则将虚拟机会设置为是否设置为设置为要设置为要设置为要设置为设置为设置值的设置值的设置值的设置值。如果是这样,它将继续检查老年最大的连续空间是否大于老年物体的平均大小。如果您少于或设置,则必须此时更改为完整的GC。

  JDK 6更新后的规则24变为:

  只要老年的连续空间大于新一代的总规模或先前晋升的平均促进效果,就将执行次要GC,否则将执行全GC。

  通过在老年中删除废弃的数据,扩大了老年人的闲置空间,以保证新一代。

  此过程是为了分配保证。