使用JProfiler解决Java应用程序内存溢出问题实例

标签: jprofiler java 应用程序 | 发表时间:2014-08-06 21:00 | 作者:lance2002
出处:http://www.iteye.com

    前段时间基于OpenJms部署了一个消息中间件服务器,通过主题订阅模式在各个消息节点之间传递信息,但是某个类型的消息节点长时间运行后出现了内存溢出问题,最后使用JProfiler的基本线程监测功能找到问题所在,并且进行解决。

 

Java 版本 java version "1.7.0_40"

JProfiler 版本 v8.0.7

 

 

1、 打开JProfiler,选择New Session


 

2、 点击Attach,按ok,以便从本地JVM中选择正在运行的java程序

 

3、 选择session,这里可以看到本机运行的所有java程序,我的应用ID为844,因此,选择844,点击ok

 

4、 可以看到JProfiler正在尝试连接到该java应用

 

5、 选择Instrumention,可以使用到所有的JProfiler特性,但是对于JVM的读取可能存在一定的风险使得java应用出现异常。

 

6、 设置完成后,直接ok

 

7、 主界面上可以看到当前产生的对象,占用的内存比例

 

8、 选择左侧栏的Telemetries,可以看到当前的内存分配和使用情况

 

9、 选择左侧栏下面的Threads,可以看到当前的线程执行情况,如图可以看到,当前的运行线程(绿色部分),阻塞线程(红色部分),网络或IO线程(蓝色部分),等待线程(橙色部分)。此时节点未接受任何消息,因此线程和内存都处于平稳运行状态。


 

10、 有任务消息下达时,线程数猛增

 

11、 具体可以看到左侧栏Threads页面下面的线程数量

 

12、 慢慢的,随着消息数量的增多,处理线程越来越多,几乎是直线上涨

 
 
 13、 至此,可以看到线程的数量在不断增多,而并不是之前预想的一旦一个线程完成就立即释放资源,因此极有可能是这里导致了内存溢出。


 
 14、 Java自己的内存回收GC正在努力工作,回收我忘记释放的资源。

 

15、 很小的程序,由于内存没有处理好,cpu占用却不小

 

16、 由于GC的关系,内存占用呈现出锯齿状,但由于资源未释放,总内存使用量一直在随时间增大。

此处为展示完全,因此没有达到内存溢出的地步。

 

17、 经过对代码的分析,实际的执行消息处理类是单例模式,代码的意图是创建唯一的一个线程池,然后接收到消息后就将任务塞到线程池中执行。但是实际的实现却是,每接收到一个任务就创建了一个线程池,并且任务执行完后并没有回收线程池,因此导致了这个结果。

pool = Executors.newScheduledThreadPool(cnf.getServerType());

 

将其修改为

if (pool == null) {

    pool = Executors.newScheduledThreadPool(5);

}

 

 

18、 修改之后,线程的运行情况如图,已经不再重复创建无用的线程池,而是稳定在一定数量的线程,平稳运行。

 

 线程运行情况

 

CPU占用率 

 

 

GC的活跃情况 


 

 

内存占用情况

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jprofiler java 应用程序] 推荐:

使用JProfiler解决Java应用程序内存溢出问题实例

- - Java - 编程语言 - ITeye博客
    前段时间基于OpenJms部署了一个消息中间件服务器,通过主题订阅模式在各个消息节点之间传递信息,但是某个类型的消息节点长时间运行后出现了内存溢出问题,最后使用JProfiler的基本线程监测功能找到问题所在,并且进行解决. Java 版本 java version "1.7.0_40". JProfiler 版本 v8.0.7.

在Docker中监控Java应用程序的5个方法

- -
作者:Chris Ward . 译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化. 通常情况下,监控的主要目的在于:减少宕机时间、扩展和性能管理、资源计划、识别异常事件和故障排除分析等. 本文作者介绍了5种方法帮助你在Docker中监控Java应用程序.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

iPhone应用程序推荐

- sylvia - 月光博客
  本文将为大家推荐一些笔者非常喜欢的iPhone应用程序. 注意,并不怎么包括游戏,因为笔者不太喜欢玩游戏,要玩也只玩小游戏. 这也有些遗憾,毕竟iPhone最大的卖点就是丰富的游戏了. 本文主要是推荐实用的软件和系统工具. 对新手应该帮助比较大,老鸟们也可以参考一下. 而且本文也不提供下载链接与安装方法.

Android 一个应用程序调用另一个应用程序

- - CSDN博客推荐文章
实现行业应用调用我们可以Get到哪些技能. * Activity的singleTask的启动模式 * 界面跳转的基本实现 * 前台Service的基本介绍和实现 * SharedPreference的简单用法. 在XHL应用程序中去调用MPos应用程序,借助MPos的一些界面完成特殊的功能. (1)创建名为XHL的应用程序.

优秀的WEB应用程序

- DayuLu - 互联网的那点事
今天我们将分享给大家一批优秀的WEB应用程序. 比如,大家可能用过在线的调色工具,Adobe也推出过在线的Photoshop软件. 这些程序或许就是未来软件程序的基础. 随着云处理和网络速度的飞速发展,这将是个好的趋势. 人们只需要一台在线的电脑就可以找到需要的应用程序,而不需要在自己电脑上安装复杂的文件.

Eclipse开发Android应用程序入门

- Bingnan - 酷壳 - CoolShell.cn
原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/. 如今的移动设备应用程序开发充满着让人振奋的东西. 功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战.

开源应用程序架构

- WCM - LinuxTOY
建筑师会在训练过程中学习并了解上千年来由不同大师所设计的建筑,而软件工程师却鲜有这样的机会去了解现实中的软件架构是什么样子. 该书列举了以下开源软件架构设计:. 该书依照 Creative Commons Attribution 3.0 Unported 发布,既可以在线阅读,也可以在 Lulu 上购买纸质印刷版本和 PDF 电子书版本(其他格式的电子书版本正在制作中).

Web应用程序的开发步骤

- xxg - 月光博客
  如今已进入了web2.0高速发展的互联网时代,各种互联网的Web应用程序如雨后春笋般出现. 那么作为一名Web开发人员,怎样去开发一款优秀的Web应用程序呢. 这个问题没有一个简单的答案,甚至那些教育机构都未必能清楚的知道. 所以,像大多数在这个领域里的web开发人员一样,我们只是通过去做,去实验才学会了这些.

提升 web 应用程序的性能

- pathfinder - IBM developerWorks 中国 : 文档库
作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要. 本文将帮助您更好地理解影响 web 应用程序性能的因素. 学习识别这些问题并且找到客户端内容的瓶颈. 探索 JavaScript、DOM、CSS 和 Dojo 小部件的性能问题. 将通过一个例子展示使用 YSlow 和 Firebug 适当调整 Dojo 小部件.