java内存报错error及相关解决办法

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

需要重点排查以下几点:

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

    如果出现stackoverFlow,可以从哪些地方来定位问题

    其实上面两个问题都可以从原理方面来展开:

    java虚拟机中,五个区得知道吧,程序计数器,虚拟机栈,本地方法栈,堆,方法区,除了程序计数器,其他区都可能发生OutOfMemory。比如:

    虚拟机栈扩展时无法申请到足够的内存时将会跑出OOM异常。

    本地方法栈和虚拟机栈差不多,所以也会出现同样的问题。

    堆的话主要是存放对象的,如果GC后,仍然没有足够的内存分配,也不能扩展,将会抛出OutOfMemoryError:Java Heap Space异常,如果不是真的有逻辑问题(莫名创建了大量的对象),那可以尝试下调整下虚拟机的默认内存空间大小,vm arguments框里输入一些简单的参数配置,

    各个参数的含义为:

  7. -Xms,表示程序启动时,JVM 堆的初始化最小尺寸参数;
  8. -Xmx,表示程序启动时,JVM 堆的初始化最大尺寸参数;
  9. -XX:PermSize,表示程序启动时,JVM 方法区的初始化最小尺寸参数;
  10. -XX:MaxPermSize,表示程序启动时,JVM 方法区的初始化最大尺寸参数。
  11. 方法区的话,如果它使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。permGen代表的是permanent generation,永久代的意思。PermGen 空间的使用量, 与JVM加载的 class 数量有很大关系,随着生成的class越来越多,将会占满Permgen空间

    https://blog.csdn.net/renfufei/article/details/77994177

    栈溢出的相关参考这个(https://blog.csdn.net/Beyond_2016/article/details/81286223

CPU 过高怎么办

1、存在死循环

2、tomcat原因,下载新的tomcat试试

3、计算线程较多

jmap命令有下面几种常用的用法:

•jmap [pid]

•jmap -histo:live [pid] 其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。

•jmap -dump:live,format=b,file=xxx.xxx [pid]

用得最多是后面两个。

jmap -dump:live,format=b,file=xxx.xxx [pid] 则可以将当前Java进程的内存占用情况导出来,方便用专门的内存分析工具(例如:MAT)来分析。

jstat用法

jstat -gcutil pid统计gc信息

jconsole和jvisualvm多用下,性能监控工具

http://renxiangzyq.iteye.com/blog/739562

猜你喜欢

转载自blog.csdn.net/q957967519/article/details/82686986