性能测试-java内存溢出问题排查

背景:

最近测试一个智能呼叫系统,就是AI代替人工客服批量给客户打电话作推广活动,在测试的过程中,应用服务器和数据库服务器资源使用都挺正常的,但是长久不重启应用,过个2-3天,执行个几次同时呼叫600个电话拨打任务后,就可能存在:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space

上线时间太紧了,被SB总监催着不管质量只管进度的上线。周日被开发喊来看性能问题。周一就要交差了。

这里我想说的是,这么久以来,我们的开发框架都非常稳定了,一般就是抓抓弱智的慢语句,看看线程在干啥有没有乱搞导致应用负载飙升。关于内存这方面,可以说没有那么大的需求那个高的要求,一直都没啥进步,都是吃老本,包括使用的工具,
也是几年都没变的Java VisualVM,变的只有是从jdk1.6升级到了1.
8

关于内存溢出

网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。

首先,你windows本机得安装好java,我这里用的是java8。java的安装这里不累赘了。不过这里解释几个名词。以免看不懂

java:开发语言,一种名称

jdk:java语言的软件开发工具包,全称是:Java Development Kit

jre:JRE是Java Runtime Environment缩写,指Java运行环境

jvm:JVM是Java Virtual Machine(Java虚拟机)的缩写

VisualVM:是JAVA自带的,一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优

java gc:java垃圾回收,说到这个话就多了。涉及到对jvm堆中无用对象进行回收

扩展知识:JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。
JVM堆
    (1) 新域:存储所有新成生的对象
    (2) 旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧域
    (3)永久域:存储类和方法对象,从配置的角度看,这个域是独立的,不包括在JVM堆内。默认为4M。

GC的工作目的很明确:在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用.大多数垃圾回收的 算法思路都是一致的:把所有对象组成一个集合,或可以理解为树状结构,从树根开始找,只要可以找到的都是活动对象,如果找不到,这个对象就是凋零的昨日黄 花,应该被回收了。

我们现在存在的问题就是:GC不了垃圾,导致时间久了,内存会溢出,这个即使增大jvm也无济于事,只不过能延缓

这种问题如果不从代码层面优化,还有个欺骗领导的办法:

1、应用 每天重启一次,释放垃圾

2、jvm配置原来的2倍内存

上面全是废话一般的理论,下面介绍VisualVM的安装与使用

 Java VisualVM安装与使用

1、打开本机上的F:Program FilesJavajdk1.8.0_131injvisualvm.exe即可

2、应用服务器-即要监控的java应用部署的机器上

/usr/java/jdk1.8.0_101/bin

上传2个文件:链接:https://pan.baidu.com/s/1EZ460Vlz9fesExl10WnN_A  提取码:ibjk

resin中配置:设置远程连接端口9009

<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.port=9009</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.authenticate=false</jvm-arg>

启动jstatd服务,启动1099默认端口给客户端监控

nohup ./jstatd.sh &

查看端口,是否9009和1099都启动成功:netstat -nlp

3、visualvm连接添加监控及配置

a、装插件:工具-插件,Visual GC插件地址已经不存在了。所以在线安装是不成功的

这里介绍手动安装方法

https://visualvm.github.io/pluginscenters.html 进visualvm的插件中心下载对应版本的插件

我的java版本是jdk1.8.0_131,对应应该是:https://visualvm.github.io/uc/8u131/updates.html

进入此页面,下载 要用的插件

下载后:

从本地导入插件进入:

然后勾选安装 ,安装完成即可。

远程-右键-添加远程机器

 

 如果监控的这台机器上jstatd服务1099端口启动了,然后允许远程监控端口9009也启动了,那么这里就会有结果

我们看应用进程 pid那一项结果

转载于:https://blog.csdn.net/sincool1003/article/details/83579005

原文地址:https://www.cnblogs.com/it-deepinmind/p/14231702.html