`
lance2002
  • 浏览: 7401 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

阅读更多

    前段时间基于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程序,我的应用ID844,因此,选择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的活跃情况 


 

 

内存占用情况

 

 

 

  • 大小: 36.8 KB
  • 大小: 93.3 KB
  • 大小: 59.9 KB
  • 大小: 48.4 KB
  • 大小: 159.8 KB
  • 大小: 175.7 KB
  • 大小: 83.7 KB
  • 大小: 69.7 KB
  • 大小: 72.1 KB
  • 大小: 77.2 KB
  • 大小: 90.9 KB
  • 大小: 65.7 KB
  • 大小: 100.3 KB
  • 大小: 106.5 KB
  • 大小: 80.5 KB
  • 大小: 72.3 KB
  • 大小: 85.9 KB
  • 大小: 77.2 KB
  • 大小: 72 KB
  • 大小: 71 KB
  • 大小: 77.3 KB
  • 大小: 69 KB
分享到:
评论

相关推荐

    某应用内存溢出(暨jvm)分析分享

    标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...

    jprofiler8

    当Tomcat出现内存溢出问题时,开发者需要快速定位并解决问题。此时,一款强大的Java性能分析工具——jProfiler 8就显得尤为关键。 jProfiler是一款功能强大的Java性能分析工具,尤其在内存分析、线程分析、CPU性能...

    Jprofiler使用介绍--java性能分析工具中文帮助.pdf

    它集CPU、线程和内存分析于一体,提供了一套全面的解决方案来检测和优化Java应用的性能问题。JProfiler的使用对于理解和提升Java服务器的性能至关重要,尤其是在模拟负载环境下。 在分析Java服务器性能时,首先需要...

    java内存溢出示例(堆溢出、栈溢出)

    Java内存溢出,是编程过程中常见的问题之一,它通常会导致程序异常终止,影响系统的稳定性。内存溢出分为两种主要类型:堆溢出(Heap Overflow)和栈溢出(Stack Overflow)。接下来,我们将深入探讨这两种情况及其...

    Java运行内存

    此外,使用工具如VisualVM、JProfiler等可以对Java应用程序的内存使用情况进行监控和分析,帮助开发者找出潜在的问题。 总结一下,Java运行内存模型是Java程序运行的基础,理解其工作原理有助于优化程序性能,预防...

    Java内存溢出及分析

    例如,使用内存分析工具(如VisualVM或JProfiler)可以帮助检测内存泄漏,通过调整JVM参数优化内存分配,以及编写合理的代码避免无用对象的长期存在。对于堆溢出,可以尝试减少对象创建,合理设计数据结构,以及及时...

    java程序中的内存分配问题javalearnsa资料分享

    学习Java内存分配不仅有助于编写高效代码,还能帮助排查和解决性能问题,提升系统的稳定性和可靠性。通过深入理解这些概念,开发者可以更好地控制和优化Java程序的内存使用,从而提高程序的运行效率。

    java 内存监控

    Java内存监控是Java应用程序性能优化的关键环节,它可以帮助开发者识别并解决内存泄漏、垃圾收集问题以及潜在的服务器性能瓶颈。本文将深入探讨Java内存监控的相关知识点,并提供实用的命令工具来帮助你查找和解决...

    JAVA的缓存应用介绍

    JAVA的缓存应用主要涉及到Java内存体系的理解、基础缓存的使用、缓存框架的介绍以及内存溢出状况的分析和内存检查工具的使用。...正确设置JVM内存参数和使用内存检查工具是优化Java应用程序不可或缺的技能。

    JavaCore和HeapDump分析工具

    JavaCore和HeapDump是两种重要的Java应用程序诊断工具,它们用于理解和优化Java应用程序的性能和内存使用情况。在Java运行环境中,遇到性能问题或者内存泄漏时,开发者通常会借助这类工具来定位问题。 JavaCore,也...

    JVM垃圾回收器工作原理及使用实例介绍Java开发Java

    在Java开发中,JVM(Java虚拟机)是运行Java应用程序的关键组件,它负责解析字节码、管理内存以及执行程序。垃圾回收(Garbage Collection, GC)是JVM自动进行的一项重要任务,用于回收不再使用的对象所占用的内存...

    java内存管理

    Java内存管理是Java编程中的核心概念,它涉及到程序运行时如何高效地分配、使用和...通过理解和掌握这些知识点,开发者能够更好地编写高效的Java代码,避免因内存问题导致的程序不稳定,提升应用程序的性能和可维护性。

    Tomcat内存溢出分析及解决方法

    Java虚拟机(JVM)内存管理是Java应用性能优化的关键部分,特别是在运行像Tomcat这样的Java应用服务器时。内存溢出问题,尤其是堆和非堆内存溢出,可能导致服务中断,影响应用程序的稳定性和性能。本文将深入探讨这...

    java[1].lang.OutOfMemoryError_Java_heap_space错误及处理办法

    - 使用内存分析工具如VisualVM、Eclipse Memory Analyzer (MAT) 或 JProfiler 来监控应用内存使用情况,并识别潜在的内存泄漏问题。 - 仔细检查代码逻辑,确保所有不再使用的对象都被适当地设置为`null`,以便垃圾...

    基于Java虚拟机内存模型的性能调优方法.zip

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,管理内存,以及优化程序性能。...通过深入理解和实践这些知识,开发者能够有效地优化Java应用程序,提升系统的运行效率和稳定性。

    Jprofile分析器

    内存溢出是Java应用程序常见的问题,当程序分配的内存超过了系统可提供的内存,就会导致程序崩溃。JProfiler通过提供详细的内存分析功能,可以帮助我们定位导致溢出的原因。它提供了实时的内存快照,可以比较不同...

    java问题定位

    Java问题定位是指在Java应用程序运行过程中,通过一系列技术和工具来发现并解决程序中出现的各种问题的过程。这包括但不限于识别异常、性能瓶颈以及内存泄漏等问题,并采取相应的措施来修复它们。 ##### 1.2 常见...

    JVM内存管理及调优

    JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着丰富经验的专家,通过他的演讲PPT,我们能深入理解JVM内存的实现、使用和调优。 ### 一、JVM内存实现...

Global site tag (gtag.js) - Google Analytics