86 views

Java程序的编写的服务器内存高与CPU跑满的解决方案

By | 2019年2月23日

一、运行内存过高

1、运行内存过高通常有几种状态:内存溢出和内存泄漏

(1)内存溢出:应用程序划分的运存高于物理机的内存大小,引致未能延续分配内存,出显OOM错误码。

(2)内存泄漏:从未用到的变量不停抢占着运行内存不脱离,致使这块内存浪费掉,长此以往,内存泄漏的变量堆积起来,也会诱发物理机的运行内存被枯竭,出显OOM错误码。

2、运行内存过高的探测妙招:大多数当我们的java代码网络服务器构建在LInux机器设备里边,能否实现jvm原机的命令提示符采取这种探测。

(1)查阅基类的总数和霸占内存大小

①性能参数为Java源程序的线程号,将给果读取到某个分类目录中。

jmap -histo:live <进程号> > <导出目录+文件名>
②示例如下,可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查。

③一些特殊的标识的含义

[C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的
[S 表示short[]
[I 表示int[]
[B 表示byte[]
[II 表示int[][]
num\##instances\##bytes class name
———————————————-
1: 585152 75635896 [C
2: 66541 71446496 [B
3: 1141734 36535488 java.util.HashMap$Entry
4: 176622 26086840 <constMethodKlass>
5: 176622 24034208 <methodKlass>
6: 17717 19584560 <constantPoolKlass>
7: 174454 18375128 [Ljava.util.HashMap$Entry;
8: 571222 13709328 java.lang.String
9: 832783 13324528 java.lang.Integer
10: 17717 13198840 <instanceKlassKlass>
11: 15092 11237440 <constantPoolCacheKlass>
12: 46779 10429728 [I
13: 191501 7660040 java.util.LinkedHashMap$Entry
14: 12599 6567592 <methodDataKlass>
15: 113526 6357456 java.util.HashMap
16: 197998 6335936 java.util.Hashtable$Entry
(2)如果需要进一步定位问题代码,那么就需要把Java程序的内存镜像导出,再具体分析了,通过如下命令导出程序的内存镜像

jmap -dump:format=b,file=<导出目录+文件名> <进程号>
(3)下載Memory Analyzer道具来分析内存镜像

(4)打开软件后,File–>Open Heap Dump…,打开刚才导出的镜像文件,选择Leak Suspects Report,Finish,进入分析页面

Histogram:列表展示出内存中的对象数目和占用内存大小
Dominator Tree:列表展示出程序中每个线程中的对象数目和占用内存大小
Top Consumers:图表展示出每个线程的对象数目和占用内存大小
Top Components:图表展示出内存中的对象数目和占用内存大小
Leak Suspects:这个是最常用的,会自动检测分析内存异常的原因
右键对象–>show objects by class可以查看对象的具体情况

by incomming reference:显示引用该对象/线程的其他对象

by outgoing reference:显示当前对象/线程引用的其他对象

Java服务器内存过高与CPU过高问题排查

(5)单击Leak Suspects,源程序会解析出由于产生电脑内存难题的地儿,延续单击Detail上能找到基本那些子类和线程,然后快要跟据进展情况简析了

其次,CPU过高

1.当源程序遇到CPU过高的情况时,您可以使用Windows系统的Process Explorer工具软件来查找线程丢失率高的CPU,以及需要在Windows机器设备中设置的任何测试环境来设置网络服务器,正确地模拟在线CPU的状态吗?

2、在良好的区域环境后,确认任务管理器,在进程栏中查找Java应用程序的进程号

Java服务器内存太高,CPU太高

3、下载Process Explorer专用工具

4、打开刀具后,根据刚才的工艺编号查找工艺

Java服务器内存太高,CPU太高

5,右键–>属性,然后选择线程选项,点击进入CPU行,可以发现CPU损失最大的是一个线程。

Java服务器内存太高,CPU太高

6、使用科学计算器,将十进制线程数转换为十六进制,字有493620->gt

Java服务器内存太高,CPU太高

7,这一直是询问程序编号和线程号的机会,然后使用JVM原始指令来引导Java堆栈消息。

jstack-l<进程号>><导出目录+文件名>

本文转载于:http://win-man.com

作者:Java技术专家
本文关键词:Java    程序     命令
网络安全技术员 网站安防技术员 网络防护专家 网站维护工程师

发表评论

电子邮件地址不会被公开。 必填项已用*标注