性能测试:Java内存溢出问题排查

发表于:2021-5-26 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:雪山非竹    来源:CSDN

  背景:
  最近测试一个智能呼叫系统,就是AI代替人工客服批量给客户打电话作推广活动,在测试的过程中,应用服务器和数据库服务器资源使用都挺正常的,但是长久不重启应用,过个2-3天,执行个几次同时呼叫600个电话拨打任务后,就可能存在:org.springframework.web.util.NestedServletException:Handlerprocessingfailed;nestedexceptionisjava.lang.OutOfMemoryError:Javaheapspace
  上线时间太紧了,被SB总监催着不管质量只管进度的上线。周日被开发喊来看性能问题。周一就要交差了。
  这里我想说的是,这么久以来,我们的开发框架都非常稳定了,一般就是抓抓弱智的慢语句,看看线程在干啥有没有乱搞导致应用负载飙升。关于内存这方面,可以说没有那么大的需求那个高的要求,一直都没啥进步,都是吃老本,包括使用的工具,也是几年都没变的JavaVisualVM,变的只有是从jdk1.6升级到了1.8。
  关于内存溢出
  网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。
  首先,你windows本机得安装好java,我这里用的是java8。java的安装这里不累赘了。不过这里解释几个名词。以免看不懂。
  java:开发语言,一种名称;
  jdk:java语言的软件开发工具包,全称是:JavaDevelopmentKit;
  jre:JRE是JavaRuntimeEnvironment缩写,指Java运行环境;
  jvm:JVM是JavaVirtualMachine(Java虚拟机)的缩写;
  VisualVM:是JAVA自带的,一款免费的,集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力,对Java应用程序做性能分析和调优;
  javagc:java垃圾回收,说到这个话就多了。涉及到对jvm堆中无用对象进行回收;
  扩展知识:JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。
  JVM堆
  (1)新域:存储所有新成生的对象;
  (2)旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧域;
  (3)永久域:存储类和方法对象,从配置的角度看,这个域是独立的,不包括在JVM堆内。默认为4M。
  GC的工作目的很明确:在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用.大多数垃圾回收的算法思路都是一致的:把所有对象组成一个集合,或可以理解为树状结构,从树根开始找,只要可以找到的都是活动对象,如果找不到,这个对象就是凋零的昨日黄花,应该被回收了。
  我们现在存在的问题就是:GC不了垃圾,导致时间久了,内存会溢出,这个即使增大jvm也无济于事,只不过能延缓。
  这种问题如果不从代码层面优化,还有个欺骗领导的办法:
  1、应用每天重启一次,释放垃圾;
  2、jvm配置原来的2倍内存;
  上面全是废话一般的理论,下面介绍VisualVM的安装与使用。
  JavaVisualVM安装与使用
  1、打开本机上的F:\ProgramFiles\Java\jdk1.8.0_131\bin\jvisualvm.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、装插件:工具-插件,VisualGC插件地址已经不存在了。所以在线安装是不成功的。
  这里介绍手动安装方法
  https://visualvm.github.io/pluginscenters.html进visualvm的插件中心下载对应版本的插件。
  我的java版本是jdk1.8.0_131,对应应该是:https://visualvm.github.io/uc/8u131/updates.html
  进入此页面,下载要用的插件:
  下载后:
  从本地导入插件进入:
  然后勾选安装,安装完成即可。
  远程-右键-添加远程机器
  如果监控的这台机器上jstatd服务1099端口启动了,然后允许远程监控端口9009也启动了,那么这里就会有结果。
  我们看应用进程pid那一项结果。

  上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号