首先,以后碰到任何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杀死的调查的更多相关文章

  1. 在工作中常用的Linux命令

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...

  2. 工作中常用的Linux命令:mkdir命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...

  3. 工作中常用的Linux命令:crontab命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...

  4. 工作中常用的Linux命令:ipcs/ipcrm命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6057100.html (转载请注明出处) ipcs 1. 命令格式 ipcs [resource-option ...

  5. 工作中常用的Linux命令:find命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6056571.html (转载请注明出处) 1.命令格式 find [-H] [-L] [-P] [-D deb ...

  6. 总结工作中常见的linux命令

    本文是总结下自己在工作中遇到的常见linux 命令,会持续更新! 1.文件路径切换 进入 cd 返回上一级  cd .. 2.复制 cp 源文件名 目标文件夹 cp log.log test5 3.编 ...

  7. 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...

  8. 转-软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...

  9. 我在华为,软件测试人员在工作中如何运用Linux?

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到.对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux系 ...

随机推荐

  1. 第二十五天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zwszws/article/details/28493209            6月4日.晴天. ...

  2. input输入框数字转带千分位的字符串

    数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...

  3. JS对象 window对象 屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏。 2. screen.availHeight 属

    屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏. 2. screen.availHeight 属性返回访问者屏幕的高度,以像素 ...

  4. sql中char,varchar,nvarchar的区别

    char[n] 是定长的,也就是当存储字符小于n时,他会自动补齐(补空值).优点:效率较varchar高. varchar[n]是变长且非unicode字符数据类型,n的取值在1到8000之间,该类型 ...

  5. windows10自带的画图软件打出来的字是斜的,怎么解决?

    因为字体中带@的字体,方向就是斜的,所以打字时不要用前面带@符号的字体. 用其他字体方向为正常的

  6. 避免 Java 代码中的“坏味道”

    1.需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的.但是,当需要主键和取值时,迭代 entrySet() 才是更高效的 ...

  7. Java Collection - PriorityQueue 优先队列

    总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...

  8. CSS格式化---属性排序

    一.背景 与同事合作开发一个项目,后面修改 CSS 时,发现属性顺序跟我写的不一样 我从事开发前端时,导师是有给我大概指定了一定的书写规范 现在开发时,看到的 CSS 属性排序不一样,看起来有点难受( ...

  9. Android中对TextView中的部分内容的字体样式的设置方法

    Android中的TextView中内容,有时候需要对其部分内容添加下划线和颜色操作: String str = "回复 " + uname + " 的评论: " ...

  10. NX二次开发-基于MFC界面对话框与NX交互的开发

    打开VS2013 点击新建,选择MFC DLL 点击确定 点下一步 什么都不改,直接点完成 进来之后先编译一下,看是否编译成功 打开项目属性,更改这几处 $(UGII_BASE_DIR)\ugopen ...