linux环境JVM内存死锁问题分析

最近在一次压力测试问题分析中,发现运行在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)

at org.apache.log4j.Category.callAppenders(Category.java:204)

- parking to wait for  <0x0000000751968760> (a org.apache.log4j.Logger)

at org.apache.log4j.Category.forcedLog(Category.java:391)

at org.apache.log4j.Category.log(Category.java:856)

at com.xx.esi.log.logger.log4j.Log4jLogger.info(Log4jLogger.java:45)

at com.xx.esi.log.logger.support.FailsafeLogger.info(FailsafeLogger.java:119)

at com.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)

at com.xx.cb.web.servlet.HttpService.doPost(HttpService.java:116)

步骤三:解决以上代码缺陷。

时间: 2024-08-26 19:00:04

linux环境JVM内存死锁问题分析的相关文章

JVM内存死锁问题分析

现象: 发现运行在tomcat的应用,不管上多少个vuser模拟请求压力,只会耗用200%的cpu,测出应用的tps很低,近10次每秒. 分析: 1.网络的瓶颈排除 2.执行jstack -l 线程号 >线程号.log log如下: 3.看出来了0x0000000751968760 的内存变量一个锁住,另一个在获取锁,出现死锁问题.接下来优化代码即可

Linux与jvm内存关系分析

原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存应该是足够使用的:但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示.同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析这个问题,理解JVM和操作系统之间的内存关系非常重要.接下来主要就Linux与

linux tomcat jvm内存优化

PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance. GC(Garbage Collection)应该不会对PermGen space进行清理所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误 Java Heap分为3个区,Young,Old和Permanent.Young保存刚实

Linux环境 Java内存快速查看

最近生产环境遇到内存老是占用很大的情况,16G的内存Free的内存只剩100多M,仿佛一颗定时炸弹一般,说不定就服务Down了.于是开始网上不断的找查看内存使用的方法.现学现卖,以下通过一个例子来演示,共3步. 一.通过Top命令来查看进程情况,按Shift+M可按内存占用大小排序 二.通过ps命令查看是哪个应用 三.通过jmap命令来显示堆使用情况,jmap是jdk中自带的内存查看工具,具体使用可参考 http://www.cnblogs.com/xingzc/p/5778014.html 写

Linux环境变量设置中配置文件分析(/etc/profile,~/.bashrc等)(转)

说明:在研究中发现,对于不同版本的Linux系统有着不同的文件,但是总的入口是不变的/etc/profile,下面只是展示加载顺序的研究过程,所以会有些系统没有这个文件等问题. 一.配置文件与作用域: 1.系统级别: /etc/environment:在登录时操作系统使用的文件,系统在读取profile前,设置环境文件的环境变量. /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.

生产环境-jvm内存溢出-jprofile问题排查

通常来说,分析堆内存快照(Heap Dump)是一个很好的定位手段 ,开启了dump的参数: -XX:+HeapDumpOnOutOfMemoryError 有了这个参数,当我们不得不面对内存溢出异常的时候会节约大量的时间.默认情况下,堆内存快照会保存在JVM的启动目录下名为java_pid<pid>.hprof 的文件里(在这里<pid>就是JVM进程的进程号) dump的内容有2G,先进行压缩打包,传输至本地(scp) tar -czvf dump.tar java_pid48

Linux环境下的CPU消耗分析

在Linux系统中, CPU 主要用于中断,内核以及用户进程的任务处理,优先级为 中断 > 内核 > 用户进程.在CPU消耗分析中,我们还经常遇到下面几个概念. 上下文切换         每个CPU在同一时间只能执行一个线程, Linux 中线程是抢占式调度的. 也就是说每个线程分配一定的执行时间,当到达执行时间,线程中有IO阻塞或者高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前线程的的执行状态,并恢复要执行的线程的状态,这个过程就称为上下文切换.在java 应用程序中

只需4个步骤,分析解决在生产环境下JVM内存泄露问题

作者:未完成交响曲 发现异常 首先通过我们内部搭建的日志平台发现我们线上环境一个java应用有大量的http接口请求超时,登录linux服务器查看网络环境没有问题,判断是应用自身运行异常,重启应用后发现异常还在,开始查找问题. 初步查找问题 通过指令:jstat -gcutil 查看jvm内存占用和gc情况: 发现老年代内存占用比例过高,并且每次fullGC后并没有有效回收.老年代内存占用百分比变化趋势大致如下: 初步判断大量请求超时和服务瘫痪的直接原因:每次fullGC后的内存占用越来越高内存

Linux与JVM的内存关系分析(转)

引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存应该是足够使用的:但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示.同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析这个问题,理解JVM和操作系统之间的内存关系非常重要.接下来主要就Linux与JVM之间的内存关系进行一