背景: 最近测试一个智能呼叫系统,就是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