堆内存管理应用例题

这篇博客探讨了Java对象在JVM中的内存申请过程,重点介绍了Eden、Survivor和Old区的角色。当Eden空间不足时,进行minor collection,释放不活跃对象;如果仍然不足,活跃对象会进入Survivor区。Old区空间不足时,进行major collection。如果所有区域都无法容纳对象,会导致'Out of memory'错误。
摘要由CSDN通过智能技术生成
下列关于堆内存管理描述错误的是() A
A.堆内存分为年轻代、老年代、持久代,持久代内存溢出为OutOfMemoryError: Java heap space
B.当Eden区满,再创建对象,会触发年轻代GC,不能回收的对象会放到To Survivor区
C.年轻代的To Survivor满了或里面的对象足够Old(超过XX:MaxTenuringThreshold),则这些对象被copy到老年代
D.当Old区被放满的之后,进行Full GC,Full GC后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,则出现OOM错误

内存申请过程

  1. JVM会试图为相关Java对象在Eden中初始化一块内存区域;
  2. 当Eden空间足够时,内存申请结束。否则到下一步;
  3. JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
  4. Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
  5. 当old区空间不够时,JVM会在old区进行major collection;
  6. 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误"

关于以下方法调用描述正确的是:AD

1
2
3
4
5
6
private static final List<String> list = new ArrayList<>();
public static String test(String j){
     int i = 1, s = 1, f = 1, a = 1, b = 1,c = 1,d = 1,e = 1;
     list.add( new String( "11111111111111111111111111111" ));
     return test(s+i+f+a+b+c+d+e+ "" );
}

A.一定会发生” OutOfMemoryError: Java heap space”
B.一定会发生” StackOverflowError”
C.一定会发生” OutOfMemoryError: Java heap space与StackOverflowError”
D.当发生内存溢出错误时不需要用try…catch来捕获,需检查代码及jvm参数配置的合理性

递归时没有退出条件会发生栈溢出。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值