2015-03-11 19:47 1098人阅读 评论(0) 收藏 举报
 分类:
VisualVM(8) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

Java虚拟机性能管理神器 - VisualVM(7)  排查JAVA应用程序线程泄漏

1. 线程泄漏原因

搞清楚线程泄漏原因之前,我们先了解一下什么是线程泄漏和线程溢出。(已经了解这两个概念的同学,请直接看下一节)。

泄漏:一般指工业中不应该流出或漏出的物质或流体,流出或漏出机械设备以外,造成损失,称之为泄漏(百度百科)。

线程泄漏:指系统中动态分配的线程,在使用完毕后未关闭,导致相关资源未释放,结果导致一直占据系统资源,直到系统结束。直白点说,就是线程使用完毕后没有关闭或者正常停止,即线程泄漏。

溢出:是指就是某个容器装满了东西后,再装就流出来了,即溢出。

线程溢出:指系统中达到了线程分配的极限,无法再创建新的线程时,还在收到新创建线程的请求,无法创建的一种状态,即线程溢出。

在系统中,泄漏和溢出是有因果关系的:即,发生线程泄漏后,会导致线程溢出。或者说泄漏是原因,溢出是结果。但是有时候溢出不一定是泄漏造成的,例如:目前系统允许程序最多创建100个线程,由于当前并发量大,线程池目前已有98个线程正在处理业务,如果此时又并发请求创建了5个线程,就会造成线程池溢出,但是这个不能算是线程泄漏造成的,只能算是高并发业务场景下产生的线程溢出。

弄明白线程泄漏的含义后,我们就明白了线程泄漏的原因:线程使用完后没有正常关闭导致。

再说说实际应用中的问题:在生产环境,发生了数据修改后不更新的问题。业务逻辑是修改组织数据后,会将修改信息通过消息中间件通知订阅的服务,订阅的服务收到通知后,根据修改的信息更新缓存中的数据。由于缓存中的数据没有更新,所以刚开始怀疑是消息中间件没有传输成功。

2. 线程泄漏排查

有了排查目标后,就跟踪日志进行排查,发现消息能到应用服务接收方,说明消息传输成功,是应用收到消息后没有更新导致。那么就通过VisualVM远程监控JVM的运行状态,首先发现内存异常,Old区内存满了,说明有资源没有释放,而监视页面显示实时线程接近5000个,而一般应用的线程基本在100以下,说明线程运行不正常。将程序放到本机进行运行,查看线程标签,显示出具体业务线程运行后,一直处于运行和休眠状态,排查具体业务线程的逻辑,发现是在调用线程的逻辑中,每次都新建了一个业务线程,调用的任务又是通过定时器每隔几分钟运行一次,而业务线程只需要启动一次就行了,重复调用就会导致业务线程不断创建,最终导致线程资源泄漏而产生溢出,影响其他业务正常运行。

3. 线程泄漏处理

发现线程泄漏后,根据业务逻辑,将对应的代码进行重构,将定时调用的业务线程,做成静态方法进行调用,或者在调用任务类中,业务线程作为参数进行引用,避免重复创建。

Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏【转】的更多相关文章

  1. Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏【转】

    Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏[转] 标签: javajvm内存泄漏监控工具 2015-03-11 18:30 1870人阅读 评论(0) 收藏  ...

  2. Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

    Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁[转] 标签: javajvm监控工具性能优化 2015-03-11 19:59 1948人阅读 评论(0) 收藏  ...

  3. Java虚拟机性能管理神器 - VisualVM(3) 插件安装与更新路径配置

    Java虚拟机性能管理神器 - VisualVM(3)  插件安装与更新路径配置 插件路径地址配置方法: VisualVM打开后,会发现功能比较单一,只有概述.监视.线程.抽样器.Profiler五个 ...

  4. Java虚拟机性能管理神器 - VisualVM(2) 入门

    一下载VisualVM 最新版本下载 历史版本下载 二启动VisualVM 三VisualVM用户目录 四VisualVM窗口 1应用程序窗口 2详情窗口 五VisualVM插件   Java虚拟机性 ...

  5. Java虚拟机性能管理神器 - VisualVM(1) 简介 - JVM轻量级监控分析神器

    目录(?)[-] 一VisualVM是什么 二如何获取VisualVM 三获取那个版本 四VisualVM能做什么 显示JAVA应用程序配置和运行时环境 显示本地和远程JAVA应用程序运行状态 监控应 ...

  6. Java虚拟机性能管理神器 - VisualVM(8) 查找JAVA应用程序耗时的方法函数【转】

    Java虚拟机性能管理神器 - VisualVM(8) 查找JAVA应用程序耗时的方法函数[转] 标签: javajvm监控工具性能优化 2015-04-07 16:47 1846人阅读 评论(0)  ...

  7. Java虚拟机性能管理神器 - VisualVM(4) - JDK版本与VisualVM版本对应关系

    Java虚拟机性能管理神器 - VisualVM(4)    -  JDK版本与VisualVM版本对应关系 JDK版本与VisualVM版本对应关系说明 JDK版本与VisualVM版本对应关系 参 ...

  8. Java虚拟机性能管理神器 - VisualVM(5) 监控远程主机上的JAVA应用程序【转】

    Java虚拟机性能管理神器 - VisualVM(5) 监控远程主机上的JAVA应用程序[转] 标签: javajvm监控工具性能优化 2015-03-11 18:37 1394人阅读 评论(0) 收 ...

  9. Java虚拟机性能管理神器 - VisualVM(2) 入门【转】

    Java虚拟机性能管理神器 - VisualVM(2) 入门[转] 标签: java插件jvm监控工具入门 2015-03-11 16:54 955人阅读 评论(0) 收藏 举报  分类: Visua ...

随机推荐

  1. Java-Class-@I:org.springframework.stereotype.Service

    ylbtech-Java-Class-@I:org.springframework.stereotype.Service 1.返回顶部   2.返回顶部 1. package com.ylbtech. ...

  2. Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 BINARY

    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvo ...

  3. 剑指offer——17数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   保证base和exponent不同时为0   一般解法: 直接相乘: cl ...

  4. SpringBoot-集成PageHelper5.1.2踩坑

    背景就不介绍了,项目是SpringBoot+MyBatis搭建的,需要集成git上的PageHelper5.1.2,这个插件大家都比较熟悉了 之前一直用的PageHelper4.0.3,集成是这样的: ...

  5. OC开发系列-成员变量的作用域

    成员变量的作用域 OC中成员变量有四种作用域,同时每一种作用域对应着响应的关键字. * @private:自能在当前类的实现@implementation中访问 * @protected: 可以在当前 ...

  6. await和async

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 随笔记录 Linux基本操作命令 2019.7.27

    临时关闭防火墙systemctl stop firewalld永久关闭防火墙systemctl disable firewalld 临时关闭selinux安全机制setenforce 0永久关闭sel ...

  8. 【转】40个Java多线程问题总结

    文章转自 五月的仓颉 http://www.cnblogs.com/xrq730/p/5060921.html 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习, ...

  9. ld.so和ld-linux.so* :动态链接器/加载器(转)

    概述 动态链接器可以被正在运行的动态链接程序或者动态对象(没有对动态链接器指定命令选项,动态链接器被存储在程序的.interp区域)间接调用,也可以直接运行程序, 例如:/lib/ld-linux.s ...

  10. Linux CentOS 6.7 挂载U盘

    1. 首先查看U盘是否成功安装fdisk -l 2. 在/mnt下创建U盘目录mkdir /mnt/usb 3. 挂载U盘mount -t vfat /dev/sdb1 /mnt/usb 4. 卸载U ...