l245737347 2022-03-01 16:12 采纳率: 0%
浏览 99

内存溢出时,finally会继续执行,finally中new 对象还能成功?

public static void main(String[] args){
List list = new ArrayList();
try{
while(true){
list.add(new OutOfMemory("try"));
}
}catch(Exception e){
System.out.println(e);
}finally {
System.out.println("finally");
OutOfMemory o = new OutOfMemory("finally o");

        System.out.println(o.test);
        System.out.println(list.size());
        System.out.println(o.test);
    }
}

执行结果:
finally
finally o
106710
finally o
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at main.java.com.liqiangx.memory.OutOfMemory.main(OutOfMemory.java:18)

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2022-03-01 16:18
    关注

    finally一定会执行的。
    可以通过下面方法实时获取堆内存。

    // 获取MemoryMXBean
    MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
    // 打印:堆内存使用
    logger.info("heapMemoryUsage: {}", memoryMXBean.getHeapMemoryUsage().toString());
    // 打印:非堆内存使用
    logger.info("nonHeapMemoryUsage: {}", memoryMXBean.getNonHeapMemoryUsage().toString());
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)