"JAVA各种OOM代码示例与解决方法"攻略
什么是OOM
OOM是"Out Of Memory"的缩写,意为内存用尽。Java程序中,如果申请内存超过了JVM所限制的最大内存,则会发生OOM异常。在Java程序中,由于内存泄漏或者分配内存过多导致的OOM异常较为常见。
OOM异常的种类
-
Java heap space
JVM使用的java堆内存中没有多余的空间来分配对象。 -
PermGen space
Permanent Generation是JVM用来存储元数据和类的信息的区域。Java程序可用的PermGen space固定不变,程序占用的PermGen space不能超过JVM限制的最大值。 -
GC overhead limit exceeded
JVM花费的时间在GC上太多,导致程序几乎不能正常工作。 -
unable to create new native thread
指的是应用程序创建的时候线程太多,线程数量超过JVM或者操作系统的限制。 -
requested array size exceeds VM limit
在JVM中申请的数组大小太大,无法满足需求。
OOM示例
Java heap space
public class JavaHeap {
public static void main(String args[]) {
ArrayList<Object> l = new ArrayList<Object>();
while(true) {
l.add(new Object());
}
}
}
这个程序会不断创建新对象并添加到ArrayList中,最终导致内存耗尽,抛出Java heap space异常。
PermGen space
public class PermGen {
public static void main(String[] args){
int i = 0;
while (true){
System.out.println(i++);
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Integer.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
});
enhancer.create();
}
}
}
这个程序利用cglib进行类增强,每次都会产生一个新的类并加载到PermGen space中,最终导致内存耗尽,抛出PermGen space异常。
OOM解决方法
-
扩大内存
可以通过指定JVM启动参数 "-Xmx" 和 "-Xms" 来改变JVM最大和最小可以使用的内存大小。 -
优化程序代码
尝试尽可能地减少内存分配并且及时清理内存,以避免创建过多的对象和内存泄漏。 -
使用JVM工具
可以使用 JVM 内建的工具,比如 jmap、jhat、jstack、visualvm 等来检测程序中的内存泄漏问题,找出内存消耗大量的代码块,以及提高代码效率。 -
增加硬件设施
如果某个程序存在内存耗尽的问题,并且优化程序代码和设置JVM参数的操作都不能解决这个问题,那么可以尝试增加硬件设施,比如安装更大内存的服务器,并且使用多线程来提高程序效率。
以上是关于Java OOM的代码示例和解决方法,希望可以帮助到大家。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA各种OOM代码示例与解决方法 - Python技术站