OOm是否可以try catch

只有在一种情况下,这样做是可行的:

在try语句中声明了很大的对象,导致OOM,并且可以确认OOM是由try语句中的对象声明导致的,那么在catch语句中,可以释放掉这些对象,解决OOM的问题,继续执行剩余语句。

但是这通常不是合适的做法。

Java中管理内存除了显式地catch OOM之外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等。
在JVM用光内存之前,会多次触发GC,这些GC会降低程序运行的效率。
如果OOM的原因不是try语句中的对象(比如内存泄漏),那么在catch语句中会继续抛出OOM

转自:https://blog.csdn.net/gvvbn/article/details/79454701

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方法区(JDK 1.7及以下)或元空间(JDK 1.8及以上)是存储类信息、常量池、静态变量等的区域,通常不容易出现OOM。但是如果我们大量使用动态代理生成类,或者反复加载大量的类,就可能导致方法区或元空间OOM。 下面是一个可以导致方法区或元空间OOM的示例代码: ```java import java.lang.reflect.Proxy; public class MethodAreaOOM { public static void main(String[] args) { while (true) { // 使用动态代理创建对象 Object proxy = Proxy.newProxyInstance( MethodAreaOOM.class.getClassLoader(), new Class[]{MethodAreaOOMInterface.class}, new MethodAreaOOMInvocationHandler()); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } private interface MethodAreaOOMInterface { void method(); } private static class MethodAreaOOMImpl implements MethodAreaOOMInterface { @Override public void method() { } } private static class MethodAreaOOMInvocationHandler implements java.lang.reflect.InvocationHandler { @Override public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws Throwable { return method.invoke(new MethodAreaOOMImpl(), args); } } } ``` 这段代码会不断地使用动态代理生成类,如果运行时间足够长,就会导致方法区或元空间OOM。 另外,如果想要快速导致方法区或元空间OOM,可以使用如下参数启动Java虚拟机: ``` -XX:MaxMetaspaceSize=8m ``` 这样就将元空间的最大值设置为8MB,通常会很快导致OOM。但是这样做需要谨慎,因为它会影响整个Java虚拟机的运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值