java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章

本文详细介绍了Java内存管理中eden区的作用和对象分配过程,包括对象的生存判断、垃圾收集算法、分代收集原理,以及如何避免内存溢出问题。文章通过实例展示了对象优先在eden区分配、大对象直接进入老年代、长期存活对象的晋升策略,讨论了如何判断对象是否死亡,如引用计数法和可达性分析算法。此外,文章还探讨了不同类型的引用(强引用、软引用、弱引用、虚引用),并提到了垃圾收集器如Serial、Parallel Scavenge、CMS和G1的特性及其应用场景。
摘要由CSDN通过智能技术生成

写在前面

本节常见面试题:

问题答案在文中都有提到

如何判断对象是否死亡(两种方法)。

简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。

如何判断一个常量是废弃常量

如何判断一个类是无用的类

垃圾收集有哪些算法,各自的特点?

HotSpot为什么要分为新生代和老年代?

常见的垃圾回收器有那些?

介绍一下CMS,G1收集器。

Minor Gc和Full GC 有什么不同呢?

本文导火索

当需要排查各种 内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。

1 揭开JVM内存分配与回收的神秘面纱

Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。

Java 堆是垃圾收集器管理的主要区域,因此也被称作GC堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

堆空间的基本结构:

上图所示的 eden区、s0区、s1区都属于新生代,tentired 区属于老年代。大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden区->Survivor 区后对象的初始年龄变为1),当它的年龄增加到一定程度(默认为15岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

1.1 对象优先在eden区分配

目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

大多数情况下,对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时,虚拟机将发起一次Minor GC.下面我们来进行实际测试以下。

在测试之前我们先来看看 Minor GC和Full GC 有什么不同呢?

新生代GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC经常会伴随至少一次的Minor GC(并非绝对),Major GC的速度一般会比Minor GC的慢10倍以上。

测试:

public class GCTest {

public static void main(String[] args) {

byte[] allocation1, allocation2;

allocation1 = new byte[30900*1024];

//allocation2 = new byte[900*1024];

}

}

通过以下方式运行:

添加的参数:-XX:+PrintGCDetails

运行结果(红色字体描述有误,应该是对应于JDK1.7的永久代):

从上图我们可以看出eden区内存几乎已经被分配完全(即使程序什么也不做,新生代也会使用2000多k内存)。假如我们再为allocation2分配内存会出现什么情况呢?

allocation2 = new byte[900*1024];

简单解释一下为什么会出现这种情况: 因为给allocation2分配内存的时候eden区内存几乎已经被分配完了,我们刚刚讲了当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC.GC期间虚拟机又发现allocation1无法存入Survivor空间,所以只好通过 分配担保机制 把新生代的对象提前转移到老年代中去,老年代上的空间足够存放allocation1,所以不会出现Full GC。执行Minor GC后,后面分配的对象如果能够存在eden区的话,还是会在eden区分配内存。可以执行

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值