首页
社区
课程
招聘
[原创]java 故障排除 JVM概述
发表于: 2013-1-9 01:35 3169

[原创]java 故障排除 JVM概述

2013-1-9 01:35
3169

哎,像来这里跟大家学习逆向知识,本人对这块非常感兴趣,工作之余一直都喜欢看着方面的资料,无奈不是正式会员,只能在新人交流区发帖,所以希望发写有意义的帖子能够升级为正式会员,可我不是个对逆向很牛B的人,在java领域还算是有点基础,想要混个正式会员,只能给大家介绍下java相关方面的知识,不知是否对大家有帮助。

先了解目前JVM的主要种类:
houtspot jvm:oracle公司旗下的,其实就是原先sun公司的,sun被orcle收购后就成了hotsport
jrockit jvm:也是oralce公司旗下的,其实原先是bea公司的产品,也就是大家熟悉的weblogic中间件看开发商,知识后来也被oracle收购了。。。。(个人感觉oracle真够强悍的,这两个公司可都是很牛B的公司啊,竟然都被他收购了,一个是java看鼻祖,一个是java应用服务中的龙头老大,竟然都败在了oracle手下)
IBM J9:IBM公司研发的jvm,主要针对AIX操作系统使用,其他操作系统不能使用;好像最新版本的 1.7有支持windows的,但估计也没人用,毕竟不够成熟谁敢用呢;

好了,主要的jvm就上面三种了;他们的各个优劣我做下简单的对比吧;

                                
hotspot:
优点:公认的java 虚拟机鼻祖,使用最为广泛,开发者最为了解,但一般情况只是在开发阶段使用;
缺点:其实也没太大的缺点,但感觉一般服务器使用hotsport的虚拟机比较少;

jrokit
优点:据有关人员统计,在性能上比houtspot高一些;另外他自带的监控工具jrmc比较强大,有助于故障排除;

缺点:好像也没什么缺点(这里说的缺点是相对于其他jvm的缺点)

IBM J9
优点:性能还是可以的,相关的工具比较丰富

缺点:只能在aix上运行

如何选择JVM:

32位 vs 64位:
优先选32位的,性能比64的高,至少现在是这样的;对于那些需要大量数据导出的可以考虑64位的,因为导出数据一般对内存要求比较高;

jrockit vs hotspot
客户端优先选hotspot,服务端优先选jrockit;  客户端使用hotsport的时候,最后知道那个hotsport是以客户端模式启动,也即是要加 -client 参数,加载jvm的启动参数中; 

对于hotsport,有两种模式,client和server模式,client模式启动快,但处理速度稍慢,而server模式则恰好相反;具体原因不做解释,优点懒得打字了请原谅哈...

IBM J9就没得说了,只能在AIX上运行,没得选了,而且aix也只能使用IBM J9虚拟机;

所以得出的结论是:在飞AIX环境下,如果是服务端程序,应该选择Jrockit,而在客户度程序则使用hotsport(现在java客户度程序很少,基本都是做服务端,另外开发期使用最多的是hotsport);在AIX下当然就是IBM j9了;
另外应该选择最新版本中的稳定版本的jvm

下面说下股指排除:

在java开发中,最长遇到的错就是内存泄露和内存溢出偶尔也会有内加载的问题;
要排除,当然的先收集一些数据啊和监控才能排除故障啊,所以,我还是先讲下故障信息的收集吧和监控吧;

收集故障信息:
主要收集两类文件:
javacore文件和dump文件;javacore是程序现场的快照文件,反应了当时程序现场的相关信息,dump文件时内存快照文件,反应了程序当时的内存信息;

如何获取者两类文件?
javacore文件,可以使用java的bin目录下的jstack工具获得(IBM的除外,ibm的好像没这个工具)

dump文件可以使用bin目录下的jmap工具获得(ibm的除外,ibm没这个工具)

注:jstack和jmap的使用,请自己百度下,很容易的;

上面说的是使用jdk自带的工具(除ibm),还可以借助其他工具,如visualvm(hotspot 1.6还是1.7后自带的),jrmc(jrockit自带的)这两个工具都很请大,可以监控系统线程、内存等信息;你用了就知道了,是故障排除不可缺失的工具哦;

另外商业工具:jprofilter、jprfile还有其他的不一一列出来 ;

好了,通过上面说的几个工具可以对hotsport和jrockit的jvm进行监控,并获得javacore和dump文件。

上面其实都是通过工具获取的,其实有时候我们是在程序出现问题的时候才需要出现javacore文件和dump文件,这该怎么办?可以再JVM启动的时候加入相关的参数后,具体是哪个参数一时帮会我忘记了,自己百度一下,我知识告诉你可以这样做,具体怎么做,你自己百度下哈 

另外还可以加一些参数,在windows下按ctrl+break,liux环境下使用kill -3 pid 可以获得dump和javacore文件(必须要在jvm启动的时候加了参数才有下,还是老规矩,具体什么我不写,自己百度,我只告诉你可以这么做)

上面说的是hotsprot和jrockit的javacore和dump的获取方式,那么IBM的呢?

在我的知识范围内,IBM没有特定的工具可以产生javacore和dump文件,它值能通过java环境变量:比如在程序启动的shell脚本中加入export IBM_XXX=tue,具体是什么给网了,比较长,老规矩,自己百度,我只告诉你是通过export 变量的方式获取的; 加入了这些参数后,在程序出现崩溃或者手工执行kill -3 pid操作后都会产生javacore文件和dump文件;

至此如何获取故障信息的方式就介绍完了,下面介绍怎么利用这些工具找出故障

闲话插一句,打字好累.........

离线故障分析工具:
mat工具,一个基于eclipse插件的故障分析工具,我感觉比较好用;可以分析出内存和线程的相关信息;
另外ibm的IBM HeapAnalyze(dump分析工具)IBM Thread and Monitor Dump Analyzer for Java(线程分析工具)这两个工具也很有用,IBM还是提供了很多有用的工具的;

离线分析工具就说道这里了,上面介绍的三个分析工具都是离线分析工具;

在线故障分析工具
visualvm和jrmc已经jconsole等都比较好用;打字累了,不具体介绍了

如何获取故障信息文件介绍了,分析这些故障文件的工具也介绍了,下面说下怎么使用这些工具找出故障吧。其实很简单,so easy 

打开工具,加载文件,如果是内存问题,你看那个对象占用内存大,占用大,基本就有问题,尤其看到了我们熟悉的代码,比如自己写的代码,那就要注意了,很可能问题就是这里。其他没什么技巧,就是看谁占用大,大的就有问题;
通常导致内存溢出的对象偶哪些呢?
比如:map对象,数组或者集合以及缓存也即是cache会造成内存泄露和溢出的可能性比较大;

在说一句:打字好累,很晚了,块两点了,明天还要上班,累啊.........

线程分析更简单了,有问题,通过上面的工具打开javacore文件,基本上,一目了然,很清楚看到那些有问题那些没问题。  

细节不讲了,累了........

讲的还不完整不够细,请见谅,没时间了,要睡了,明天还要上班。

手酸了.......

  朋友们晚安哈   快过年了,准备抢票了...哈哈,123 抢啊...

在这里真心寻找对逆向和底层有浓厚兴趣的朋友,愿一起学习进步...本人目前是做java方面的,但对系统底层技术和逆向有种非常浓厚的兴趣,工作之余多会看看这方面的资料,无奈一个人埋头苦学去的的成效破差,而且和苦恼郁闷枯燥.... 所以在此发帖,寻知己寻伙伴 。。
   


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (2)
雪    币: 47147
活跃值: (20485)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
欢迎你的加入,现在己是正式会员了。
2013-1-9 21:49
0
雪    币: 75
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
非常感谢坛主   ;  真心在这里与看雪的童鞋们进行技术交流...
2013-1-9 23:33
0
游客
登录 | 注册 方可回帖
返回
//