当前位置: 首页 > Java > 正文

Sun JDK代码中处理OOM的方式

1 星2 星3 星4 星5 星 (2 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

在Sun JDK代码中,在不同的OOM时,会调用不同的处理方式来进行处理,下面就来看看JDK中几个典型的处理OOM的代码。
创建线程失败

1
2
3
4
5
compiler_thread = new CompilerThread(queue, counters);
if (compiler_thread == NULL || compiler_thread->osthread() == NULL){
vm_exit_during_initialization(“java.lang.OutOfMemoryError”,
“unable to create new native thread”);
}

对于JDK中必须创建成功的线程,如失败会通过调用vm_exit_during_initialization打印出OOM错误,并退出Java进程。
对于非必须创建成功的线程,通常会调用

1
2
THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
“unable to create new native thread”);

抛出OOM错误信息。

调用os:malloc失败

1
2
3
4
void *p = os::malloc(bytes);
if (p == NULL)
vm_exit_out_of_memory(bytes, “Chunk::new);
return p;

当os:malloc或os:commit_memory失败时,会直接输出错误信息,并退出Java进程。

Java Heap上分配失败后

report_java_out_of_memory(“Java heap space”);
调用这个就表明了不会退出vm,而只是抛出OOM错误。
例如PermGen分配失败时的代码更为直观:

1
2
3
4
5
6
7
8
9
10
HeapWord* result = Universe::heap()->permanent_mem_allocate(size);
if (result != NULL) {
NOT_PRODUCT(Universe::heap()->
check_for_non_bad_heap_word_value(result, size));
assert(!HAS_PENDING_EXCEPTION,
“Unexpected exception, will result in uninitialized storage”);
return result;
}
// -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
report_java_out_of_memory(“PermGen space”);

总体而言,对于一个大型系统而言,通常OOM是难以避免的现象,最重要的还是一旦出现OOM,要掌握排查的方法,另外就是,随着现在内存越来越便宜,CMS GC越来越成熟,采用64 bit操作系统,开启大内存也是一种可选方式,基本上可以避免内存成为大问题,毕竟在Java中完全可能随便写几行代码就不知不觉消耗了很多内存。

ps: 感兴趣的同学还可参考sun官方的这篇关于OOM的文章:

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html

本文固定链接: http://www.chepoo.com/sun-jdk-handle-oom-error.html | IT技术精华网

Sun JDK代码中处理OOM的方式:等您坐沙发呢!

发表评论