html5视频网站模板,长沙找工作最新招聘信息,印章在线制作网站,上海网站自然排名优化价格Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 JDK1.8之前的堆内存示意图#xff1a; 从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为#xff1a;Ed…Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 JDK1.8之前的堆内存示意图 从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为Eden 区Survivor1 区Survivor2 区。值得注意的是在 JDK 1.8中移除整个永久代取而代之的是一个叫元空间Metaspace的区域永久代使用的是JVM的堆内存空间而元空间使用的是物理内存直接受到本机的物理内存限制。 1.对象优先在eden区分配 目前主流的垃圾收集器都会采用分代回收算法因此需要将堆内存分为新生代和老年代这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 大多数情况下对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时虚拟机将发起一次Minor GC.下面我们来进行实际测试以下。 在测试之前我们先来看看 Minor GC和Full GC 有什么不同呢 新生代GCMinor GC:指发生新生代的的垃圾收集动作Minor GC非常频繁回收速度一般也比较快。老年代GCMajor GC/Full GC:指发生在老年代的GC出现了Major GC经常会伴随至少一次的Minor GC并非绝对Major GC的速度一般会比Minor GC的慢10倍以上。2.大对象直接进入老年代 大对象就是需要大量连续内存空间的对象比如字符串、数组。 为什么要这样呢 为了避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。 3.长期存活的对象将进入老年代 既然虚拟机采用了分代收集的思想来管理内存那么内存回收时就必须能识别哪些对象应放在新生代哪些对象应放在老年代中。为了做到这一点虚拟机给每个对象一个对象年龄Age计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活并且能被 Survivor 容纳的话将被移动到 Survivor 空间中并将对象年龄设为1.对象在 Survivor 中每熬过一次 MinorGC,年龄就增加1岁当它的年龄增加到一定程度默认为15岁就会被晋升到老年代中。对象晋升到老年代的年龄阈值可以通过参数 -XX:MaxTenuringThreshold 来设置。 4 动态对象年龄判定 为了更好的适应不同程序的内存情况虚拟机不是永远要求对象年龄必须达到了某个值才能进入老年代如果 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半年龄大于或等于该年龄的对象就可以直接进入老年代无需达到要求的年龄。 转载于:https://www.cnblogs.com/Dream-chasingGirl/p/10351575.html