进行网站建设有哪些重要意义,个人模板图片,厦门方易网站制作有限公司,宿迁城乡建设监督网站JVM堆内存结构简述
JVM堆内存结构图 堆初体验
所有的对象实例以及数组都要在堆上分配#xff0c;堆是垃圾收集器管理的主要区域#xff0c;也被称为“GC 堆”#xff0c;也是我们优化最多考虑的地方。因为在一个项目中#xff0c;会不断地创建对象#xff0c;都是在堆里…JVM堆内存结构简述
JVM堆内存结构图 堆初体验
所有的对象实例以及数组都要在堆上分配堆是垃圾收集器管理的主要区域也被称为“GC 堆”也是我们优化最多考虑的地方。因为在一个项目中会不断地创建对象都是在堆里创建如果一直不回收就会导致OOM我们听的最多的情况哈还有经常说的JVM调优也是对堆进行参数优化配置达到最接近理想状态。
结构详情
新生代 大部分刚创建的对象首先都是放在年轻代新生代内存按照 8:1:1 的比例分为一个 Eden 和两个 SurvivorSurvivor fromSurvivor to。 1. Eden 空间 Eden空间主要是存放刚刚创建的新对象如果可以Eden空间充足新对象直接存放在Eden中如果对象过大放不下则会触发 Minor GC效率很快。 Survivor 空间 每次执行Minor GC会将Eden区中存活的对象放到Survivor的From区而在From区中仍存活的对象会根据他们的年龄值来决定去向逃过一次Minor GC年龄加1默认年数为15就要到老年区。From Survivor和To Survivor的逻辑关系会在GC时发生颠倒From变To To变From目的是保证有连续的空间存放对方避免碎片化的发生后面GC流程在详细说 老年代 在新生代中经历了 N 次(默认15次)垃圾回收后仍然存活的对象就会被放到年老代中。年老代中存放的都是一些生命周期较长的对象。当老年代内存满时触发 Major GC 即 Full GCFull GC 发生频率比较低执行时间也是Minor GC的十倍以上。在老年代的对象一般为存活时间比较长的还有就是比较大的对象。 永久代/元空间 Java8 以前永久代受JVM 管理java8 以后元空间直接使用物理内存。元空间位于堆外所以它的最大内存大小取决于系统内存而不是堆大小我们可以指定 MaxMetaspaceSize 参数来限定它的最大内存。 GC回收流程 一般来说GC的触发是在对象分配过程中当一个对象在创建时他会根据他的大小决定是进入年轻代或者老年代。如果他的大小超过-XX:PretenureSizeThreshold就会被认为是大对象直接进入老年代否则就会在年轻代进行创建。PretenureSizeThreshold默认是0也就是说默认情况下对象不会提前进入老年代而是直接在新生代分配。然后就GC次数和基于动态年龄判断来进入老年代。
在年轻代创建对象会发生在Eden区但是这个时候有可能会因为Eden区内存不够这时候就会尝试触发一次YoungGC。
年轻代采用的是标记复制算法主要分为标记、复制、清除三个步骤会从GC Root开始进行存活对象的标记然后把Eden区和Survivor区复制到另外一个Survivor区。然后再把Eden和From Survivor区的对象清理掉。
这个过程可能会发生两件事情第一个就是Survivor有可能存不下这些存活的对象这时候就会进行空间分配担保。如果担保成功了那么就没什么事儿正常进行Young GC就行了。但是如果担保失败了说明老年代可能也不够了这时候就会触发一次FullGC了。
还会发生第二件事情就是在这个过程中会进行对象的年龄判断如果他经过一定次数的GC之后还没有被回收那么这个对象就会被放到老年代当中去。
而老年代如果不够了或者担保失败了那么就会触发老年代的GC一般来说现在用的比较多的老年代的垃圾收集器是CMS或者G1他们采用的都是三色标记法。
也就是分为四个阶段初始标记、并发标记、重新标记、及并发清理。
老年代在做FullGC之后如果空间还是不够那就要触发OOM了。