是什么导致你的Java服务器内存和CPU占用过高呢

一、内存占用过高1、造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏
(1)内存溢出:程序分配的内存超出物理内存的大小 , 导致无法继续分配物理内存 , 出现OOM报错 。

是什么导致你的Java服务器内存和CPU占用过高呢

文章插图
 
(2)内存泄漏:不再调用的对象一直占用着内存不释放 , 导致所占用的这块内存被浪费掉 , 久而久之 , 内存泄漏的对象堆积起来 , 也会导致物理机的内存被耗尽 , 出现OOM报错 。
 
2、内存过高的检测办法:
一般我们的JAVA服务器都是部署在linux机器上面 , 可以通过jvm自带的命令进行一些检测:
(1)查看对象的数目和占用内存大小;
(2)如果需要进一步定位问题代码 , 那么就需要把Java程序的内存镜像导出 , 再具体分析了 , 通过如下命令导出程序的内存镜像 。
 
二、CPU使用过高1、当程序发现CPU使用过高的情况时 , 可以使用windows系统的Process Explorer工具来找到CPU高消耗的线程 , 所以需要在Windows机器上面搭建好服务器的测试环境 , 尽量模拟出线上CPU飙升的情况;
2、模拟好环境后 , 通过任务管理器 , 在进程一栏中找到Java程序的进程号;
3、下载Process Explorer工具:
4、打开工具后 , 根据刚才的进程号找到进程;
5、然后右键-->Properties , 再选择Threads选项卡 , 点进CPU排序 , 可以找到消耗CPU最多的那个线程;
6、使用科学计算器 , 将十进制的线程号转成十六进制 , 比如493620-->78834;
7、到此已经拿到了可能出问题的进程号和线程号 , 接下来使用jvm内置的命令来导出Java的堆栈信息:
jstack -l <进程号> > <导出目录+文件名>
8、打开导出的堆栈信息 , 并全文搜索刚刚拿到的十六进制的线程号 , 就可以找到出问题的代码具体位置了 。

【是什么导致你的Java服务器内存和CPU占用过高呢】


    推荐阅读