• 性能测试-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

  • 相关阅读:
    win32-LPCSTR->String
    win32-UpdateLayeredWindow
    win32-CreateDIBSection的使用
    win32-StretchDIBits
    hdu1978 简单记忆化搜索
    hdu1978 简单记忆化搜索
    hdu4530 水题
    hdu4530 水题
    hdu3006 状态压缩+位运算+hash(小想法题)
    hdu3006 状态压缩+位运算+hash(小想法题)
  • 原文地址:https://www.cnblogs.com/it-deepinmind/p/14231702.html
Copyright © 2020-2023  润新知