前段时间基于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的活跃情况
内存占用情况
相关推荐
标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...
当Tomcat出现内存溢出问题时,开发者需要快速定位并解决问题。此时,一款强大的Java性能分析工具——jProfiler 8就显得尤为关键。 jProfiler是一款功能强大的Java性能分析工具,尤其在内存分析、线程分析、CPU性能...
它集CPU、线程和内存分析于一体,提供了一套全面的解决方案来检测和优化Java应用的性能问题。JProfiler的使用对于理解和提升Java服务器的性能至关重要,尤其是在模拟负载环境下。 在分析Java服务器性能时,首先需要...
Java内存溢出,是编程过程中常见的问题之一,它通常会导致程序异常终止,影响系统的稳定性。内存溢出分为两种主要类型:堆溢出(Heap Overflow)和栈溢出(Stack Overflow)。接下来,我们将深入探讨这两种情况及其...
此外,使用工具如VisualVM、JProfiler等可以对Java应用程序的内存使用情况进行监控和分析,帮助开发者找出潜在的问题。 总结一下,Java运行内存模型是Java程序运行的基础,理解其工作原理有助于优化程序性能,预防...
例如,使用内存分析工具(如VisualVM或JProfiler)可以帮助检测内存泄漏,通过调整JVM参数优化内存分配,以及编写合理的代码避免无用对象的长期存在。对于堆溢出,可以尝试减少对象创建,合理设计数据结构,以及及时...
学习Java内存分配不仅有助于编写高效代码,还能帮助排查和解决性能问题,提升系统的稳定性和可靠性。通过深入理解这些概念,开发者可以更好地控制和优化Java程序的内存使用,从而提高程序的运行效率。
Java内存监控是Java应用程序性能优化的关键环节,它可以帮助开发者识别并解决内存泄漏、垃圾收集问题以及潜在的服务器性能瓶颈。本文将深入探讨Java内存监控的相关知识点,并提供实用的命令工具来帮助你查找和解决...
JAVA的缓存应用主要涉及到Java内存体系的理解、基础缓存的使用、缓存框架的介绍以及内存溢出状况的分析和内存检查工具的使用。...正确设置JVM内存参数和使用内存检查工具是优化Java应用程序不可或缺的技能。
JavaCore和HeapDump是两种重要的Java应用程序诊断工具,它们用于理解和优化Java应用程序的性能和内存使用情况。在Java运行环境中,遇到性能问题或者内存泄漏时,开发者通常会借助这类工具来定位问题。 JavaCore,也...
在Java开发中,JVM(Java虚拟机)是运行Java应用程序的关键组件,它负责解析字节码、管理内存以及执行程序。垃圾回收(Garbage Collection, GC)是JVM自动进行的一项重要任务,用于回收不再使用的对象所占用的内存...
Java内存管理是Java编程中的核心概念,它涉及到程序运行时如何高效地分配、使用和...通过理解和掌握这些知识点,开发者能够更好地编写高效的Java代码,避免因内存问题导致的程序不稳定,提升应用程序的性能和可维护性。
Java虚拟机(JVM)内存管理是Java应用性能优化的关键部分,特别是在运行像Tomcat这样的Java应用服务器时。内存溢出问题,尤其是堆和非堆内存溢出,可能导致服务中断,影响应用程序的稳定性和性能。本文将深入探讨这...
- 使用内存分析工具如VisualVM、Eclipse Memory Analyzer (MAT) 或 JProfiler 来监控应用内存使用情况,并识别潜在的内存泄漏问题。 - 仔细检查代码逻辑,确保所有不再使用的对象都被适当地设置为`null`,以便垃圾...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,管理内存,以及优化程序性能。...通过深入理解和实践这些知识,开发者能够有效地优化Java应用程序,提升系统的运行效率和稳定性。
内存溢出是Java应用程序常见的问题,当程序分配的内存超过了系统可提供的内存,就会导致程序崩溃。JProfiler通过提供详细的内存分析功能,可以帮助我们定位导致溢出的原因。它提供了实时的内存快照,可以比较不同...
Java问题定位是指在Java应用程序运行过程中,通过一系列技术和工具来发现并解决程序中出现的各种问题的过程。这包括但不限于识别异常、性能瓶颈以及内存泄漏等问题,并采取相应的措施来修复它们。 ##### 1.2 常见...
JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着丰富经验的专家,通过他的演讲PPT,我们能深入理解JVM内存的实现、使用和调优。 ### 一、JVM内存实现...