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

需要重点排查以下几点:

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

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

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

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

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

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

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

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

各个参数的含义为:

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

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