记录一次工作中jvm被linux杀死的调查
首先,以后碰到任何jvm的错误,先看日志!!!!!!!!
web项目在tomcat目录下的log里,或者自己设定的errorfile目录下。总之,找到一切可以运用的日志,比如crash日志,coredump日志等,可以快速确定问题所在。
不过这次调查奇怪的很,不管是jvm还是tomcat,都没有任何错误日志报出。真让人难受。
经过学习,得知有一个linux命令可以助我一臂之力(感谢此命令) 那就是万能的sudo dmesg -T | grep "java"。果然,命令一出,效果空前,发现一条类似这样的错误。
localhost kernel: java: segfault at ip sp error 7 in libjvm.so
作为一个优秀的垃圾,我表示不懂这是啥(后来才知道,这就足够了啊。。。。),这条信息大概的意思如下。libjvm.so(共享动态库)运行时出现段错误。我就在想,这个error 7是什么意思?解读如下:
段错误中(segfault error),7是要解读为二进制的,即111 这个111每位对应如下:
1: 表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界。
1: 表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界。
0: 表示访问的非法地址根本没有对应的页面,也就是无效地址,值为1表示没有足够的权限访问非法地址的内容。
所以我的问题就是:用户态程序内存访问越界,写操作导致内存访问越界,没有足够的权限访问非法地址的内容。
好,问题放这里,开始我的吐槽。
从别人手中接手一个项目,起初说是不稳定,只要一运行某个程序,tomcat会直接死掉。然后这个人交给我后就跑路了,天真的我以为是个小活,因为以前只是有过一些jvm的基础知识,虽然这是第一次碰到真实情景,但是我垃圾人胆大(领导都说交给我了,我能不做?)所以我就欣(bei)然(po)接受了。
首先我阅读代码,理解业务逻辑。边理解代码边改动代码(边改边骂,这是魔鬼写的代码吗,错误太多,用法奇葩,即便不是后来发现的主要原因,程序原有的错误也真让人脑袋大)。
一天半以后,理解的差不多了,改的也差不多了,就开始我的头大之路。首先我怀疑是内存泄漏(所以说,一定要找到所有可用日志再去解决问题,唉,没经验),渣渣的我只想到了jconsole工具,好巧不巧的是,测试了两次,程序当掉的时候还都是survivor区炸掉。所以我就开始了调优。
同时jvm是被linux主动杀死的,接受了11信号,网上很多说有时候是因为程序内存占用过大导致系统自我保护而杀死进程,所以我深信不疑是内存问题了(当然了,搞了半天都白搞了)。如果有需要的可以看看,程序运行时的参数如下:-Xms128m -Xmx128m。然后还不行,还是会死,那我想啊,我的机器到底还剩了多少内存了?执行free -h 嘿嘿嘿 只剩下79M了。。。。
所以啊,我打算继续调优eclipse,毕竟开了eclipse之后,内存从1.2G锐减到79M。在eclipse的安装目录里,有个eclipse.ini配置文件,加入参数如下:
-Xms128m
-Xmx128m
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:+UseParallelGC
进入eclipse后,进入window->preferences->general->startupandshutdown->取消所有启动项(如果只是简单的开发java及javaee)。
配置完之后发现,有点用,有效内存剩了300M了,同时启动好像也快了一点哦。(这并非最优配置,且不说每个机器配置不一样,我这个128m分配就很随意,等好好了解了我再更新)。
还是没有解决问题,嘿嘿嘿。怎么办呢,一行一行测试!是的,就是注释入口的所有代码,从第一行开始一行一行解注释,并且每次解注释运行2000次。办法虽笨,还真管用,最后定位到一个so动态库。
让c的小伙伴好好查错并重新生成,问题解决。。。。。。。
再贡献一点点
实在没有任何日志,可以进行如下办法:
(1)开启linux 的core文件生成,Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。
当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。
ulimit -c 0 关闭core生成
开启步骤:sudo vim /etc/profile 在末尾添加 ulimit -S -c unlimited >/dev/null 2>&1
(2)当程序意外被kill后,在程序目录或者根目录 会生成生成core.***文件。用 gdb java core.***进行调试。
记录一次工作中jvm被linux杀死的调查的更多相关文章
- 在工作中常用的Linux命令
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...
- 工作中常用的Linux命令:mkdir命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...
- 工作中常用的Linux命令:crontab命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...
- 工作中常用的Linux命令:ipcs/ipcrm命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6057100.html (转载请注明出处) ipcs 1. 命令格式 ipcs [resource-option ...
- 工作中常用的Linux命令:find命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6056571.html (转载请注明出处) 1.命令格式 find [-H] [-L] [-P] [-D deb ...
- 总结工作中常见的linux命令
本文是总结下自己在工作中遇到的常见linux 命令,会持续更新! 1.文件路径切换 进入 cd 返回上一级 cd .. 2.复制 cp 源文件名 目标文件夹 cp log.log test5 3.编 ...
- 软件测试人员在工作中如何运用Linux
从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...
- 转-软件测试人员在工作中如何运用Linux
从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...
- 我在华为,软件测试人员在工作中如何运用Linux?
从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到.对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux系 ...
随机推荐
- 【python标准库学习】thread,threading(一)多线程的介绍和使用
在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线 ...
- a number of 和the number of用法
a number of 和the number of用法 1. A number of + 複數名詞 + 複數動詞 =some/或a lot of + 複數名詞 + 複數動詞 ...
- android中读取SD卡上的数据
通过Context的openFileInput或者openFileOutput打开的文件输入输出流是操作应用程序的数据文件夹里的文件,这样存储的大小比较有限,为了更好的存取应用程序的大文件数据,应用程 ...
- android 数据异步加载
public class MainActivity extends Activity { ListView listView; File cache; //访问其他线程在当前线程中存放的数据 Hand ...
- tcpdump - 转储网络上的数据流
总览 (SYNOPSIS) tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s ...
- BZOJ 3546 [ONTAK2010]Life of the Party (二分图最大匹配必须点)
题解:给出一个二分图,问你取点哪个点会使得二分图匹配数减少. 解法:其实就是问二分图匹配的必须点.先对初始二分图做一次最大匹配. 现在考虑左边点,看残余网络上的边重新构图:如果是匹配边那么就从右往左连 ...
- React defaultProps
defaultProps // 为属性指定默认值:Greeting.defaultProps = { name: 'Stranger'}; defaultProps 用来确保 this.props.n ...
- 2、Python 基础类型 -- String 字符串类型
字符串常用的方法: 1.分割:string.split(str="", num=string.count(str)) 以 str 为分隔符切片 string,如果 num 有指 ...
- vue 重定向
//重定向 { path: '/*', component: Home}
- 【多线程】volatile
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...