当前位置:懂科普 >

IT科技

> java outofmemory

java outofmemory

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。 

java outofmemory

第二种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
  • 文章版权属于文章作者所有,转载请注明 https://dongkepu.com/itkeji/89gxwe.html