JVM内存分配与回收

1.内存分配与回收策略

  1. 内存自动管理:自动化的解决了对象内存分配和回收对象内存的问题。
  2. 一般在堆上分配对象,也可能经过JTI编译后间接在栈上分配。
  3. 主要分配在新生代的Eden区,如果启动了本地线程分配缓冲(线程缓冲区TLAB)就优先在TLAB上分配。

2.对象优先在Eden 分配

  1. 大多数情况下,对象优先在新生代Eden区分配,当Eden区没有足够的空间分配时发生一次Minor GC。
  2. 如果Minor GC 之后筛选出的存活对象无法放入Survivor区那么这些对象就会被放入老年代。
  3. Minor GC是新生代的GC,新生代对象朝生夕死所以Minor GC非常频繁,速度也比较快。
  4. Major GC 是老年代的GC ,一般Major GC 会伴随着一次Minor GC 但并非绝对,Parallel Scavenger收集器就有直接进行 Major GC 的选择策略。Major GC 速度一般是Minor GC 的10倍以上。

Full GC 是整个堆的GC,会清理老年代和新生代。

3.大对象直接进入老年代

  1. 需要大量连续的内存空间,如很长的字符串,数组,该给避免创建朝生夕死的大对象,以免带来频繁的GC。
  2. -XX:PretenureSizeThreshold 参数可以指定超过此参数值得对象直接放入老年代。

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

  1. 虚拟机给每个对象都对了一个年龄计数器。
  2. 在Eden区出生并经过一次GC后存活,并且被Survivor容纳则计数加1,每熬过一次GC年龄就加一,默认到15就移入老年代。
  3. -XX: MaxTenuringThreshold 可以设置年龄阀值。

5.动态年龄判断。

  1. jvm并非要求对象年龄达到阀值才晋升到老年代。
  2. 在Survivor空间中如果相同年龄的所有对象的大小总和大于Survivor一半则,那么年龄大于或者等于该年龄的对象就将直接进入老年代。

6.空间分配担保

  1. 在发起Minor GC前会检查老年代最大可用连续空间是否大于该新生代全部对象之和,若大于则进行GC,这次GC是安全的,若不大于则查看HandlePromotionFailure设置值是否允许担保失败。
  2. HandlePromotionFailure如果设置是允许担保失败则继续检查 老年代最大连续可用空间是否大于历次晋升到老年代的对象平均大小,如果大于就进行一次Minor GC,此次GC是有风险的 ,如果小于或者设置为不允许担保那么就进行Full GC。
  3. 如果发起不安全的Minor GC 失败后就会进行Full GC。
  4. 大部分情况下担保是允许的,避免频繁Full GC.

原文地址:https://www.cnblogs.com/mibloom/p/9607851.html

时间: 2024-08-01 10:54:48

JVM内存分配与回收的相关文章

最简单例子图解JVM内存分配和回收

一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分为Eden区(圣经中的伊甸园).和两个Survivor区.新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区. 简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收

JVM内存分配与回收分析

java虚拟机的自动化内存可以归结为自动化解决了两个问题,一个是内存分配,一个是内存回收.了解虚拟机的分配与回收机制,能让我们对项目的把控更加有力,尤其是对性能调优时, 各个参数的设置可能会有意想不到的效果.本文结合事例分析各种场景的回收. 堆内存区域(不包括永久代)种类:1,eden space(属于新生代-new generation) 2,survivor space(属于新生代-new generation) 3,tenured generation(年老代) 首先解释下各参数的含义.我

JVM内存分配与回收策略

对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快.Major GC/Full GC:老年代GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略中就有直接进行

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

【深入理解JVM】:内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置. 本文中的内存分配策略指的是Serial / Serial Old收集器下(ParNew /

Java深入 - Java 内存分配和回收机制-转

Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC堆. Java在垃圾收集的过程中,主要用到了分代收集算法,我会先讲一下常用垃圾收集算法. 常用垃圾收集算法 1. 标记-清除算法 这种垃圾收集算法思路非常简单,主要是首先标记出所有需要回收的对象,然后回收所有需要回收的对象. 但是有一个明显的缺点,采用这种算法之后会发现内存块回收之后就不连续了,这就

转!!Java虚拟机堆的内存分配和回收

Java内存分配和回收,主要就是指java堆的内存分配和回收.java堆一般分为2个大的区域,一块是新生代,一块是老年代.在新生代中又划分了3块区域,一块eden区域,两块surviver区域.一般称为from surviver和to surviver.这些区域的大小可以自己指定.比如:(-Xms20M 表示可用堆内存大小:-Xmx40M 表示最大堆内存,在堆内存大小不够时,会扩展到最大堆内存:-Xmn10M 表示新生代内存大小). 新生代中的对象会在eden区域分配,然后eden区域的内存不够

JVM运行内存分配和回收

本文来自网易云社区 作者:吕宗胜 Java语言与C语言相比,最大的特点是编程人员无需过多的关心Java的内存分配和回收,因为所有这一切,Java的虚拟机都帮我们实现了.JVM的内存管理,大大降低了开发人员对内存管理的要求,也不容易出现C语言中的内存泄漏和溢出.但一旦应用内存发生问题,也会导致程序员难以定位.所以对于Java程序员来说认识和了解JVM的内存分配和回收对于代码的编写和应用的优化都有非常重要的意思. 1. JVM内存模型 Java的JVM的类型是非常多样的,不同的JVM对于内存的分配和

JVM内存分配简介

面向对象进阶 JVM内存分配 1.xxx.java----xxx.class (编译器进行) 2.xxx.class----类加载器(三种)----在内存分配空间 3.JVM会将内存分为5块① 栈:  Java栈区域比较小,空间大约1M. 特点:(存取数据)速度非常快,在栈里边执行的基本上都是快速的任务:基本数据类型和对象的引用.② 堆:  new出来的对象都存放在堆里边,堆里边的每一个对象都会产生一个唯一的地址. 内存地址会赋值给栈里边的引用.堆里边的对象需要垃圾回收机制才能销毁. 要销毁一个