性能调优案例分享:jvm crash的原因 1
性能调优案例分享:jvm crash的原因
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。poptest培训的课堂上通过实际案例来帮助学员提高性能测试的能力,胜任企业性能测试的工作。
jboss服务器经常莫名地突然停止运行,查看jboss控制台错误日志,发现只有下面一行:
/opt/.../jboss/bin/run.sh: line 181: 26430 段错误 "$JAVA" $JAVA_OPTS -Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" -classpath "$JBOSS_CLASSPATH" org.jboss.Main "$@"
一开始对上面的错误日志也没引起重视,一直在找JVM crash的日志hs_err_<pid>, 看了很多网上的帖子,包括JVM官网的介绍,为什么没有生成hs_err_pid日志,可能的原因就是没权限或者空间不够,查看了磁盘空间是足够的,于是 想到可能没有权限(其实默认目录就是JVM的工作目录,应该是有权限的,但当时唯一能怀疑的就是这个),所以就想到JVM参数 (-XX:ErrorFile=./hs_err_<pid>.log)可以配置这个日志文件的保存目录,但这个参数是JDK1.6才引入 的,而我们系统杯催的还停留在JDK1.5上,没办法想到另外一个参数(-XX:OnError="<cmd args>;<cmd args>"),里面配置的命令是kill -3 <pid>,这样JVM在crash的时候可以将线程堆栈dump出来,想法是好的,可这个命令一直没配上去,只能作罢。
拿不到hs_err_<pid>日志,唯一的线索就是上面仅有的一行错误日志,于是google“段错误”“segmentation fault”,发现可以通过core dump日志进行分析,解决思路也就自然而然有了。
1.core dump介绍
程序异常退出(crash)时会自动生成一个core文件,包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理等信息,也就是把程序当时工作的状态存储成一个文件。不仅仅是在出错的时候会生成core dump文件,在系统卡住或者cpu使用率很高的时候也可以手动触发生成core dump文件(当然这种情况也可以直接通过jmap和jstack dump出内存和线程堆栈,但JDK1.6以前,这2个命令经常执行不成功),这样就可以很好的分析了。
2.生成core dump文件
core dump文件生成开关其实是通过对生成的文件大小进行控制达到的,默认大小是0,也就是说默认是不生成core dump文件的,可以通过命令ulimit -c进行查看。将此参数修改成unlimited就可以生成core dump文件了,但值得注意的一点是,每个应用进程都会读取自己的一套系统参数,可以查看进程对应的内存文件/proc/<pid> /limits中的信息来判断修改后的参数值是否对此应用进程生效了,limits文件中的信息如下:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 20480 20480 processes
Max open files 204800 204800 files
Max locked memory 32768 32768 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 1024 1024 signals
Max msgqueue size 819200 819200 bytes
上述信息中的对应的参数值为unlimited,代表此应用进程的core dump开关是开着的。ulimit -c unlimited这个命令可以在很多地方修改,比如用root在命令行执行,在/etc/profile中增加(/etc/profile文件中已经有 defaultulimit -S -c 0 > /dev/null 2>&1,可以直接修改0为unlimited),在用户的.bash_profile中增加..这些方式执行后的影响范围还是挺复杂的, 到现在也没弄清楚。当时通过root用户命令行修改后,在shell里查询ulimit -c是生效了,以为应用程序也生效了,觉得不用应用都不需要重启就生效了挺好,等到下一次crash的时候发现还是没有生成core dump文件,于是到文件/proc/<pid>/limits中检查此参数值才发现应用程序所读取的值还是0。后来采用一种比较简单直接的 方式,用root用户修改/etc/profile文件中的ulimit -c的值,然后重新登录,重启应用,再检查/proc/<pid>/limits中的值,确保参数已经生效,后来应用再crash时core dump文件也如期而至,心里暗爽,终于可以开始分析堆栈了。
core dump文件生成的默认路径在用户的工作目录(启动脚本目录),可以通过设置参数/proc/sys/kernel/core_pattern的值改变 core dump文件的最终生成路径及文件名格式。core dump文件成功后,在jboss控制台错误日志中的日志也多了core dumped关键字,如下:
/opt/.../jboss/bin/run.sh: line 181: 9176 段错误 (core dumped) "$JAVA" $JAVA_OPTS -Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" -classpath "$JBOSS_CLASSPATH" org.jboss.Main "$@"
性能调优案例分享:jvm crash的原因 1的更多相关文章
- 性能调优案例分享:Mysql的cpu过高
性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...
- 性能调优案例分享:jvm crash的原因 2
3.core dump分析 有了core dump文件,接下来要做的就是通过命令去解析此文件,定位具体问题了,主要有以下三个命令: (1)先执行gdb $JAVA_HOME$/bin/java cor ...
- hbase性能调优案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- JVM性能调优2:JVM性能调优参数整理
序号 参数名 说明 JDK 默认值 使用过 1 JVM执行模式 2 -client-server 设置该JVM运行与Client 或者Server Hotspot模式,这两种模式从本质上来说是在JVM ...
- 一文带你深入了解JVM性能调优以及对JVM调优的全面总结
目录 JVM调优 概念 基本垃圾回收算法 垃圾回收面临的问题 分代垃圾回收详述1 分代垃圾回收详述2 典型配置举例1 典型配置举例2 新一代的垃圾回收算法 调优方法 反思 一.JVM调优的一些概念 数 ...
- Oracle 性能调优案例(代码级别)
业务案例一: 业务:千万记录表中查询出50条符合条件的记录. 现象:oracle部署时跨机器,业务取得数据耗时10ms.造成业务性能不达标. 为了突出主题,对于异常分支,均已省略. 对于通常写法, o ...
- SQL Server ->> 性能调优案例之 -- 包含递归查询的视图导致整个查询语句性能下降
有个语句最近性能下降很厉害,原本1秒就可以查询完毕的事情现在居然需要3-4分钟. 首先我的做法是先快速找出导致整个语句下降的元凶.在这个例子里面查询语句有3个JOIN字句,我通过删除某一个JOIN节点 ...
- JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...
- 如何合理的规划一次jvm性能调优
https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...
随机推荐
- win8 wifi开关显示关闭,且设置里面wifi开关显示灰色的解决办法
只要从华硕官网下载驱动,电源管理驱动,安装下面显示的几个软件即可,然后重启电脑,即可看见wifi热点,另外设置里面的wifi开关也将显示正常(刚开始安装了个驱动人生根本没用,最后在华硕官网下载了个电源 ...
- vc中Error spawning cl.exe错误的解决方法.
可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过.很多人的 选择是重装, ...
- 第四章:JQuery选择器
一.使用选择器的目的 从页面上的万万千千个元素中选择自己需要的. 二.选择器的分类 1.基本选择器 *:标签 *:类 *:ID 交集 AB AB共同的部分 并集 A,B AB使用相同的 ...
- Ajax封装函数笔记
Ajax封装函数: function ajax(method, url, data, success) { //打开浏览器 //1.创建一个ajax对象 var xhr = null; try { x ...
- 从CMOS到触发器(一)
作为一个学微电子专业的IC learner,这个学期也有一门课:<微电子器件>,今天我就来聊聊基本的器件:CMOS器件及其电路.在后面会聊聊锁存器和触发器. 今天的主要内容如下所示: ·M ...
- .Net开源oss项目进度更新(含小程序接口)
和大家分享下当前OSS开源项目的进度情况: 一. OSS.Common [开源中国] [github] 经过昨天的努力,oss.common项目初步完成了对.net standard的支持,迁移过程本 ...
- JavaScript两个变量交换值(不使用临时变量)
概要 本文主要描述,如何不使用中间值,将两个变量的值进行交换. 一.普通做法 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp; 普通的做法就是声明多一 ...
- .net平台的rabbitmq使用封装
前言 RabbitMq大家再熟悉不过,这篇文章主要整对rabbitmq学习后封装RabbitMQ.Client的一个分享.文章最后,我会把封装组件和demo奉上. Rabbitmq的运作 从下图可以看 ...
- 【翻译】LPeg编程指南
原文:http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html 译者序: 这个是官方的LPeg的文档.这段时间学习LPeg的时候发现国内关于LPeg的文章 ...
- sql查询表说明
一条神奇的sql语句 可以查询到数据库表的说明信息.如下:希望可以帮到大家 SELECT 表名 = case when a.colorder=1 then d.name else '' end, 表说 ...