栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

捕获java.lang.OutOfMemoryError?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

捕获java.lang.OutOfMemoryError?

我同意和不同意这里的大多数答复。

OutOfMemoryError
根据我的经验(在Windows和Solaris JVM上),你可能希望在许多情况下抓住一个机会,而对
JVM OutOfMemoryError
的丧钟很少见。

捕获

OutOfMemoryError
故障只有一个很好的理由,那就是正常关闭,干净地释放资源并尽可能地记录故障原因(如果仍然可以这样做)。

通常,

OutOfMemoryError
发生这种情况的原因是块内存分配无法用堆的其余资源满足。

当Error被抛出堆载分配的对象是不成功的分配之前相同数量的,现在是下降到运行时间对象以释放可能需要进行清理更加内存引用的时间。在这些情况下,甚至有可能继续执行操作,但这绝对不是一个好主意,因为你永远无法100%确定JVM处于可修复状态。

演示

OutOfMemoryError
并不意味着JVM的catch块中的内存不足:

private static final int MEGABYTE = (1024*1024);public static void runOutOfMemory() {    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();    for (int i=1; i <= 100; i++) {        try { byte[] bytes = new byte[MEGABYTE*500];        } catch (Exception e) { e.printStackTrace();        } catch (OutOfMemoryError e) { MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); long maxMemory = heapUsage.getMax() / MEGABYTE; long usedMemory = heapUsage.getUsed() / MEGABYTE; System.out.println(i+ " : Memory Use :" + usedMemory + "M/" + maxMemory + "M");        }    }}

此代码的输出:

1 : Memory Use :0M/247M......98 : Memory Use :0M/247M99 : Memory Use :0M/247M100 : Memory Use :0M/247M

如果运行关键任务,通常会捕获

Error
,将其记录到
syserr
中,然后使用选择的日志记录框架对其进行记录,然后继续释放资源并以一种简洁的方式关闭它。可能发生的最坏情况是什么?无论如何,JVM都快要死了(或已经死了),并且抓住它
Error
至少有清除的机会。

需要注意的是,你必须仅在可能进行清理的地方针对捕获这些类型的错误。不要

catch(Throwable t) {}
到处遮盖或胡说八道。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号