java outofmemory

作者:原创时间:2022-04-17
文档

java outofmemory是什么,让我们一起了解一下?

out of memory(内存溢出)是一个程序员常见的错误类型,通常是开启应用程序过多所导致。一般是由于电脑内存不足,配置过低,电脑开启的应用程序过多,导致内存不足或者游戏客户端的问题。

Java中OutOfMemoryError(内存溢出)出现的情况和解决办法是什么?

第一种OutOfMemoryError: PermGenspace。
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与PermanentGeneration space有关。解决这类问题有以下两种办法: 
1、增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行: 
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m" 。
如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。
2、清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。 

第二种OutOfMemoryError: Java heap space 。
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heapspace有关。解决这类问题有两种思路: 
1、检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。 
写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Javaheap space的内存溢出问题,后来通过修改程序得到了解决。 
2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m-Xmx1024m。

实战操作,本机内存溢出代码如下:

package DirectMemory;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
 * VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M
 * DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时没有真正向系统申请分配内存,而是通过计算得知内存
 * 无法分配,于是手动抛出异常。有点类似操作系统的银行家算法(避免死锁)
 */
public class DirectMemoryOOM {
    private static final int _1MB = 1024*1024;
    public static void main(String[] args) throws IllegalAccessException {
        Field unsafeField = Unsafe.class.getDeclaredFields()[0];        //获取类中第一个变量
        unsafeField.setAccessible(true);                               //设置是否可反射访问private变量
        Unsafe unsafe = (Unsafe) unsafeField.get(null);             //获取静态对象
        while (true){
            unsafe.allocateMemory(_1MB);                            //申请分配内存
        }
    }
}

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java overload java resources java resolve java require java region java render java override java pandas java parse java repeat java parser java request java partial java requests java rest java result java resultset java resume java retrofit java reverse() java outer java orm java openssl java regex java reflect java reference java redirect java rectangle java openjdk java opengl java openfire java onvif java inputstreamreader java influxdb java implements java image java htmlunit java hibernate java number java nslookup