[关闭]
@1234567890 2018-03-28T08:31:34.000000Z 字数 1217 阅读 1626

OOM

常见报错


java.lang.OutOfMemoryError:Java heap space

常见原因:应用程序需要XXL号的堆内存,但是却提供了一个s号的堆内存。也就是说:应用程序需要比它所能得到的更大的堆内存。其它引发OutOfMemory的原因更加复杂,也有可能是程序原因----内存泄漏

  1. //这段代码存在严重问题, 作为Map的key为对象,必须重写equals方法
  2. class KeylessEntry {
  3. static class Key {
  4. Integer id;
  5. Key(Integer id) {
  6. this.id = id;
  7. }
  8. @Override
  9. public int hashCode() {
  10. return id.hashCode();
  11. }
  12. }
  13. public static void main(String[] args) {
  14. Map m = new HashMap();
  15. while (true)
  16. for (int i = 0; i < 10000; i++)
  17. if (!m.containsKey(new Key(i)))
  18. m.put(new Key(i), "Number:" + i);
  19. }
  20. }

java.lang.OutOfMemoryError:GC overhead limit exceeded

应用程序花费了太多时间在做内存回收的工作,回收结果却不好。默认情况下,JVM将会报错,如果花费超过98%时间在执行GC操作,却仅仅回收了不到2%的内存。

java.lang.OutOfMemoryError:Permgen space

要么太多的类,要么太大的类被分配到了永久带空

java.lang.OutOfMemoryError:Unable to create new native thread

应用产生数以千计的线程,有时会产生异常可怕的错误。线程数目的确切数字是依赖于平台的。

  1. ulimit -a //查看系统的线程限制
  1. //这个创建线程池,在高并非情况下非常危险
  2. ExecutorService executorService = Executors.newCachedThreadPool();
  3. //之前用这个线程池虽然没报java.lang.OutOfMemoryError:Unable to create new native thread。看线程堆栈,发现有近2000个线程,线程切换严重影响性能

java.lang.OutOfMemoryError:Kill process or sacrifice child

当内核检测到系统内存不足时,OOM killer被激活,然后选择一个进程杀掉。哪一个进程这么倒霉呢?选择的算法和想法都很朴实:谁占用内存最多,谁就被干掉。

易于理解:
这就跟现实生活中的宽带运营商类似,他们向所有消费者出售一个100M的带宽,远远超过用户实际使用的带宽,一个10G的链路可以非常轻松的服务100个(10G/100M)用户,但实际上宽带运行商往往会把10G链路用于服务150人或者更多,以便让链路的利用率更高,毕竟空闲在那儿也没什么意义。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注