Java代码导致OutOfMemoryError错误的解决:
需要重点排查以下几点:
- 检查代码中是否有死循环或递归调用。
- 检查是否有大循环重复产生新对象实体。
- 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
- 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
- 第三方软件的BUG
-
如果出现outOfMemery,可以从哪些地方来定位这个问题
如果出现stackoverFlow,可以从哪些地方来定位问题
其实上面两个问题都可以从原理方面来展开:
java虚拟机中,五个区得知道吧,程序计数器,虚拟机栈,本地方法栈,堆,方法区,除了程序计数器,其他区都可能发生OutOfMemory。比如:
虚拟机栈扩展时无法申请到足够的内存时将会跑出OOM异常。
本地方法栈和虚拟机栈差不多,所以也会出现同样的问题。
堆的话主要是存放对象的,如果GC后,仍然没有足够的内存分配,也不能扩展,将会抛出OutOfMemoryError:Java Heap Space异常,如果不是真的有逻辑问题(莫名创建了大量的对象),那可以尝试下调整下虚拟机的默认内存空间大小,vm arguments框里输入一些简单的参数配置,
各个参数的含义为:
-Xms
,表示程序启动时,JVM 堆的初始化最小尺寸参数;-Xmx
,表示程序启动时,JVM 堆的初始化最大尺寸参数;-XX:PermSize
,表示程序启动时,JVM 方法区的初始化最小尺寸参数;-XX:MaxPermSize
,表示程序启动时,JVM 方法区的初始化最大尺寸参数。-
方法区的话,如果它使用的内存超过它允许的大小时,就会抛出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多用下,性能监控工具