@1234567890
2018-03-28T08:31:34.000000Z
字数 1217
阅读 1626
常见报错
常见原因:应用程序需要XXL号的堆内存,但是却提供了一个s号的堆内存。也就是说:应用程序需要比它所能得到的更大的堆内存。其它引发OutOfMemory的原因更加复杂,也有可能是程序原因----内存泄漏
//这段代码存在严重问题, 作为Map的key为对象,必须重写equals方法
class KeylessEntry {
static class Key {
Integer id;
Key(Integer id) {
this.id = id;
}
@Override
public int hashCode() {
return id.hashCode();
}
}
public static void main(String[] args) {
Map m = new HashMap();
while (true)
for (int i = 0; i < 10000; i++)
if (!m.containsKey(new Key(i)))
m.put(new Key(i), "Number:" + i);
}
}
应用程序花费了太多时间在做内存回收的工作,回收结果却不好。默认情况下,JVM将会报错,如果花费超过98%时间在执行GC操作,却仅仅回收了不到2%的内存。
要么太多的类,要么太大的类被分配到了永久带空
应用产生数以千计的线程,有时会产生异常可怕的错误。线程数目的确切数字是依赖于平台的。
ulimit -a //查看系统的线程限制
//这个创建线程池,在高并非情况下非常危险
ExecutorService executorService = Executors.newCachedThreadPool();
//之前用这个线程池虽然没报java.lang.OutOfMemoryError:Unable to create new native thread。看线程堆栈,发现有近2000个线程,线程切换严重影响性能
当内核检测到系统内存不足时,OOM killer被激活,然后选择一个进程杀掉。哪一个进程这么倒霉呢?选择的算法和想法都很朴实:谁占用内存最多,谁就被干掉。
易于理解:
这就跟现实生活中的宽带运营商类似,他们向所有消费者出售一个100M的带宽,远远超过用户实际使用的带宽,一个10G的链路可以非常轻松的服务100个(10G/100M)用户,但实际上宽带运行商往往会把10G链路用于服务150人或者更多,以便让链路的利用率更高,毕竟空闲在那儿也没什么意义。