JVM调优

216 阅读2分钟

一、内存溢出

概念:就是说系统分配的内存空间不足以存放当前数据项。比如栈溢出。进栈时,栈已满,却依旧再进栈就会出现上溢,当数据项已经全部出栈,却依然在退栈,就会出现下溢。

  • 栈溢出:栈溢出就是由于递归或循环嵌套层次太多造成的
  • 局部数组过大
  • 递归调用层次太多
  • 指针或数组越界
  • 堆溢出:导致堆溢出的操作是不断的new 一个对象,一直创建新的对象,但是不销毁

二、 内存泄漏

概念:是指new出来的对象如果是强引用、软引用应当在数据项使用完成之后,即使释放,如果没有及时释放,就会在内存里,这就是内存的泄露,内存泄露久而久之会造成内存溢出。

栈泄露:是缓冲区泄露的一种,比如布局嵌套过深会导致栈泄露等等。

堆泄漏:程序在运行中malloc/new等分配一块内存,完成没有调用相对应的free/delete释放掉;

三、 如何排查解决

  • jps 查看JVM进程ps -ef | grep java
  • Jmap 内存占用情况查哪个对象占用比较多 jmap -histo pid查看各个代内存大小 jmap -heap pid打印堆栈信息 jmap -dump:format=b,file=canal.hprof pid
  • Jstat 监控进程的classloader,compiler,gc情况jstat -gcutil pid 1000
  • Jstack查看CPU高内存的堆栈信息步骤:
  • (1) top 查看CPU最高的进程
  • (2) top -Hp pid 查看哪个线程占用的CPU最高
  • (3)printf "%x\n" tid 线程ID转为16进制格式
  • (4)jstack -l tid > ./filename.stack
  • (5)jstack pid |grep tid -A 30 查看线程堆栈信息
  • Jinfojvm的全部参数和系统属性 jinfo pid输出某属性的参数 jinfo -flag name pid