最近在一次压力测试问题分析中,发现运行在tomcat的应用,不管上多少个vuser模拟请求压力,只会耗用200%的cpu,测出应用的tps很低,近10次每秒。经过分析,不是网卡的瓶颈,于是怀疑是内存锁的问题,于是就以下操作与分析。
步骤一:在linux环境上执行jstack -l 线程号 >线程号.log
步骤二:从.log发现如下问题0x0000000751968760 的内存变量一个锁住,另一个在获取锁。出现死锁问题。
"http-apr-8090-exec-3898" daemon prio=10 tid=0x00007fa47e67b800 nid=0x192ac waiting for monitor entry [0x00007fa2eb978000]
java.lang.Thread.State: BLOCKED (on object monitor)
java.lang.Thread.State: BLOCKED (on object monitor)
atorg.apache.log4j.Category.callAppenders(Category.java:204)
-parking to wait for <0x0000000751968760>(aorg.apache.log4j.Logger)
atorg.apache.log4j.Category.forcedLog(Category.java:391)
atorg.apache.log4j.Category.log(Category.java:856)
atcom.xx.esi.log.logger.log4j.Log4jLogger.info(Log4jLogger.java:45)
atcom.xx.esi.log.logger.support.FailsafeLogger.info(FailsafeLogger.java:119)
atcom.xx.cb.web.servlet.HttpService.doPost(HttpService.java:116)
"http-apr-8090-exec-3315" daemon prio=10 tid=0x00007fa47c7f4800 nid=0x19064 runnable [0x00007fa2f608a000]
java.lang.Thread.State: RUNNABLE
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuffer.append(StringBuffer.java:237)
- locked <0x000000071fe7ee58> (a java.lang.StringBuffer)
at org.apache.log4j.helpers.PatternParser$LiteralPatternConverter.format(PatternParser.java:419)
at org.apache.log4j.PatternLayout.format(PatternLayout.java:506)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310)
at org.apache.log4j.DailyRollingFileAppender.subAppend(DailyRollingFileAppender.java:369)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
- locked <0x0000000751d00418> (a org.apache.log4j.DailyRollingFileAppender)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
- locked <0x0000000751968760> (a org.apache.log4j.Logger)
atcom.xx.cb.web.servlet.HttpService.doPost(HttpService.java:116)
-parking to wait for <0x0000000751968760>(aorg.apache.log4j.Logger)
atorg.apache.log4j.Category.forcedLog(Category.java:391)
atorg.apache.log4j.Category.log(Category.java:856)
atcom.xx.esi.log.logger.log4j.Log4jLogger.info(Log4jLogger.java:45)
atcom.xx.esi.log.logger.support.FailsafeLogger.info(FailsafeLogger.java:119)
atcom.xx.cb.web.servlet.HttpService.doPost(HttpService.java:116)
"http-apr-8090-exec-3315" daemon prio=10 tid=0x00007fa47c7f4800 nid=0x19064 runnable [0x00007fa2f608a000]
java.lang.Thread.State: RUNNABLE
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuffer.append(StringBuffer.java:237)
- locked <0x000000071fe7ee58> (a java.lang.StringBuffer)
at org.apache.log4j.helpers.PatternParser$LiteralPatternConverter.format(PatternParser.java:419)
at org.apache.log4j.PatternLayout.format(PatternLayout.java:506)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310)
at org.apache.log4j.DailyRollingFileAppender.subAppend(DailyRollingFileAppender.java:369)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
- locked <0x0000000751d00418> (a org.apache.log4j.DailyRollingFileAppender)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
- locked <0x0000000751968760> (a org.apache.log4j.Logger)
atcom.xx.cb.web.servlet.HttpService.doPost(HttpService.java:116)
步骤三:解决以上代码缺陷。
相关推荐
本文将深入探讨Linux内存结构和JVM内存模型,以及如何通过提供的文件来分析它们。 首先,让我们了解Linux内存结构。Linux内存主要分为以下几个部分: 1. **物理内存**:这是计算机硬件中的RAM,用于存储正在运行的...
本篇文章将详细探讨jProfiler7在Java内存分析上的核心功能、使用方法以及在Linux环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
3. 解决 JVM 运行过程中出现的各种问题:包括解决 OOM 问题、死锁问题、卡顿问题等。 Linux 命令 在 JVM 调优过程中,需要使用一些 Linux 命令来观察和分析 JVM 的运行情况。例如: 1. top 命令:可以用来观察 ...
### JVM堆栈性能分析 #### 一、Thread Dump 介绍 **1.1 什么是 Thread Dump?** Thread Dump,即线程快照,是诊断Java应用问题的重要工具之一。每个Java虚拟机(JVM)都能生成所有线程在某一时刻的状态快照。尽管...
最后,文档通过案例分析,介绍了内存泄露、CPU问题、线程死锁和ClassLoader类加载泄露的诊断和解决方法。这些内容为开发者提供了一套完整的监控和分析工具的知识体系,以便更好地理解和应用这些工具来提升Java应用的...
3. **线程分析**:实时查看线程状态,定位死锁和阻塞问题,对多线程应用进行深度调试。 4. **JVM设置**:JProfiler允许你动态调整JVM参数,如GC策略、类加载器行为等。 5. **数据库连接分析**:监控数据库查询性能...
当程序出现死锁、CPU占用过高或无法响应等问题时,jstack能够提供详细的线程堆栈信息,包括Java堆栈和本地堆栈,帮助定位问题所在。此工具适用于Solaris和Linux平台的JDK版本。 2. **jconsole**: jconsole是一款...
对于JavaCore,这通常是通过操作系统提供的手段触发JVM生成,例如在Unix/Linux环境下发送SIGQUIT信号。而HeapDump的生成则可以通过JVM参数设置,例如使用`-XX:+HeapDumpOnOutOfMemoryError`使得JVM在遇到OOM错误时...
3. **内存管理**:获取物理内存、交换内存、JVM内存的使用情况,以及内存分配和释放的统计信息。 4. **网络监控**:监控网络接口的状态,如带宽使用、IP地址、MAC地址等。 5. **磁盘I/O**:统计磁盘读写速度、I/O...
在Linux服务器环境中,应用卡死或性能问题是一个常见的挑战,特别是在处理高负载的服务时。针对这类问题,系统管理员和开发者需要具备一定的技能来快速定位和解决问题。以下是一套详细的排查步骤,结合了`java`、`...
3. 线程分析:查看线程状态,定位死锁和阻塞问题。 4. 监控JVM参数:实时查看和调整JVM的配置参数。 5. 数据库连接分析:检查数据库查询性能,发现慢查询。 6. 网络I/O和文件I/O监控:评估系统I/O性能。 通过这些...
5. **并发内存管理**:在多线程环境下,内存分配需要考虑线程安全,避免数据竞争和死锁问题。`synchronized`关键字可以用来保证同步访问,防止数据不一致。 6. **内存优化**:通过合理的数据结构选择、对象复用、...
在实际生产环境中,线程问题可能更加复杂,需要仔细分析`jstack`输出的线程堆栈信息,结合业务逻辑,逐步定位和解决问题。同时,优化代码、合理设计锁策略以及使用并发工具类(如`ConcurrentHashMap`、`...
4. **线程快照**:在出现问题时,可以获取线程快照,查看当前所有线程的状态,有助于分析死锁或其他并发问题。 5. **内存剖析**:帮助开发者理解和优化应用程序的内存使用,检测内存泄漏。 6. **64位Linux**:64位...
3. **线程分析**:实时查看线程状态,诊断死锁和阻塞问题。 4. **GUI性能分析**:对于Swing和JavaFX应用,JProfiler可以监测GUI更新的性能。 5. **SQL性能**:监控数据库查询性能,优化SQL语句。 六、配置与定制 ...
这一功能极大地简化了远程服务器上Java应用的性能优化工作,无需在本地环境模拟复杂的生产环境问题。 使用JProfiler进行JVM调优,首先要确保正确安装并启动JProfiler。在获得"jprofiler10.1.5"压缩包后,解压到本地...
3. **线程分析**:在多线程编程中,死锁和竞态条件是常见的问题。JProfiler提供线程可视化工具,可以实时查看线程状态,追踪并解决线程相关问题。 4. **JVM配置与监控**:JProfiler支持JVM参数调整,能帮助开发者...