首先,以后碰到任何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. 树莓派4B更换国内源

    更换清华源:https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ 注意树莓派4B的Respbian是基于Debian 10 Bluster 不要选错. ...

  2. 循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire

    nuget搜索:Hangfire 安装即可,这里我选择的是 1.7.0-beta1 版本 我是用这个集成到了 mvc api里 这里需要在 Startup 文件里进行如下配置 在配置方法 Config ...

  3. Android中XML的命名空间、自定义属性

    命名空间(namespace) XML 命名空间提供避免元素命名冲突的方法. 举个例子,A学校有名学生叫做林小明,B学校也有名学生叫林小明,那我们如何识别这两名拥有相同名字的同学呢?这时候命名空间就派 ...

  4. linux 命令 - man, help, info(查看命令帮助手册)

    man, help, info - 查看命令帮助手册   help xxx  # 显示内置命令帮助信息: xxx --help  # 显示外置命令帮助信息: man xxx  # 没有内建与外部命令的 ...

  5. 项目案例之Pipeline流水线发布JAVA项目(三)

    项目案例之Pipeline流水线发布JAVA项目(三) 链接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ 提取码:z7gj 复制这段内容后打开百度网 ...

  6. Codeforces 1163D DP + KMP

    题意:给你一个字符串s,以及两个字符串s1,s2.s中有些位置是*,意思是可以随便填字母,s的子串中如果出现一次s1,就加一分,如果出现一次s2,就减一分.问这个字符串s最多可以得多少分? 思路: 设 ...

  7. QList和QVector等容器的区别:(转)

    源地址:https://blog.csdn.net/qq_33266987/article/details/53333373 Qlist.QVector 与 list.vector似乎不太类似: li ...

  8. vue 运行项目时,Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

    npm  run dev 运行项目后 验证码显示不出来 并报错 Uncaught (in promise) DOMException: Failed to execute 'open' on 'XML ...

  9. 锐浪报表 Grid++Report 一维码无法固定条形码打印宽度

    使用过 锐浪报表的 程序员 都知道,功能很强大,确实带来了很多便利,但今天发现一个问题,关于一维码的条形码无法固定宽度: 打印相差了0.07毫米,居然差别这么大, 打印出来的条码,要么太宽,要么太窄 ...

  10. Python每日一题 002

    做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 在此生成由数字,字母组成的20位字 ...