zoukankan      html  css  js  c++  java
  • Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式

    导致OutOfMemoryError异常的常见原因有以下几种:

    1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据
    2. 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收
    3. 代码中存在死循环或循环产生过多重复的对象实体
    4. 使用的第三方软件中的BUG;
    5. 启动参数内存值设定的过小

    此错误常见的错误提示:

    1. tomcat:java.lang.OutOfMemoryError: PermGen space
    2. weblogic:Root cause of ServletException java.lang.OutOfMemoryError
    3. tomcat:java.lang.OutOfMemoryError: Java heap space
    4. resin:java.lang.OutOfMemoryError
    5. java:java.lang.OutOfMemoryError

    解决java.lang.OutOfMemoryError的方法有如下几种:

      (1)增加jvm的内存大小。方法有:

    • 在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。
    • 对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:
    set CATALINA_OPTS=-Xms128M -Xmx256M
    set JAVA_OPTS=-Xms128M -Xmx256M

       (2)优化程序,释放垃圾。

        主要包括避免死循环,应该及时释放种资源:内存, 数据库的各种连接,防止一次载入太多的数据。

    Java代码导致OutOfMemoryError错误的解决:

    需要重点排查以下几点:

    1. 检查代码中是否有死循环或递归调用。
    2. 检查是否有大循环重复产生新对象实体。
    3. 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
    4. 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

    参考Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

  • 相关阅读:
    1208C Magic Grid
    jsc2019_qualE Card Collector
    jsc2019_qualD Classified
    jsc2019_qualC Cell Inversion
    牛客提高D6t3 分班问题
    牛客提高D6t2 破碎的序列
    牛客提高D6t1 积木大赛
    loj6259「CodePlus 2017 12 月赛」白金元首与独舞
    p4208 [JSOI2008]最小生成树计数
    p4111 [HEOI2015]小Z的房间[简述矩阵树定理]
  • 原文地址:https://www.cnblogs.com/toria/p/11153982.html
Copyright © 2011-2022 走看看