记录一次工作中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系 ...
随机推荐
- 软件开发程序猿日常必备,现用现查&日志记录
日志记录-- logging模块 日志用处: 1.记录用户信息 2.记录个人流水 3.记录软件的运行状态 4.记录程序员发出的指令(跳板机) 5.用于程序员代码调试(print特别消耗内存,在开发测试 ...
- 在vim中设置tab缩进为4个字符
编辑一个文件,进入之后一次输入 [esc] --> [ : ] --> [ set ts=4 ]vim aaa.txt
- java虚拟机规范(se8)——java虚拟机结构(六)
2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处 ...
- js的width函数
参考: (1)https://blog.csdn.net/chen__jinfei/article/details/6520678 (2)https://developer.mozilla.org/e ...
- C++中的delete加深认识
delete操作: 我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身. 1.假如你不去释放,那么该区域的内存始终不能被其他数据所使用.2.指向该内存的指针是个局部变 ...
- 数组循环移动 空间复杂度O(1)
---恢复内容开始--- 题目大意: 输入元素个数,输入数组,输入右移步数,输出结果: 基本思路: 可以把数组(从下标为0开始存储)看成两部分,分别是[0,n-step-1],[n-step,n-1] ...
- Java中基本类型的包装类
基本类型包装类: 项目中我们常常放弃基本类型,用基本类型的包装类 基本类型包装类有哪些: Int--Integer char--Character double--Double 以Intger为例讲述 ...
- 使用cordova,监听安卓机物理返回按键,实现退出程序的功能
在使用html5开发app时,并不能像Android原生那样调取手机自身的方法.而cordova正好弥补了html5这一缺陷. 一,在cordova中文网http://cordova.axuer.co ...
- html根标签设置font-size为100px,使用rem,body没设置字体大小
今天使用了rem来写样式,前提是要给html设置font-size:100px;这样在计算比例时相对方便点:结果在将一个span标签设置为display:inline-block;时发现span不能能 ...
- Magento开启模板路径提示
Magento的模板就好像搭积木一样,一个一个区块累加为一层,一层一层嵌套为一个整体,看起来结构相当复杂.虽然大部分模板文件路径在page.xml等文件中能找到,但是还是有部分是系统自带的.在上面并没 ...