欢迎来到天天文库
浏览记录
ID:9495739
大小:56.00 KB
页数:6页
时间:2018-05-01
《ibm websphere application server诊断和调优(一)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、IBMWebSphereApplicationServer诊断和调优(一)近段时间,我们项目中用到的emory(内存泄漏吗?NO)。DB2连接数过大,有时把DB2撑死,有时也把AIX撑死。AIX虚拟内存报错、分页报错、IO也报错、还有很多其它莫名奇妙的错。总是,每次问题发生的现象和理论上的总是不一致,导致我们不知道从何入手,也无从检测自己的优化参数。咨询过多次IBM技术支持,只解决了某些局部问题。虽然问题依然存在,但我想,解决问题的思路、特别是理论基础,还是有一些规律和原则。对于Java虚拟机和JVM的GC
2、原理,我发现它和sun、bea的差别很大。3、IBM的heap分析器HeapAnalyzer、GCCollector。这两个事后监测工具非常实用,特别是我们的产品运行环境,非测试环境。4、某些Application的怀疑和诊断。5、AIX诊断,我几乎没有这个能力,只能常规监测一下,需另请高人。我打算将本文分成以下几个部分总结:JVM原理、IBMJVM的GC策略和调优。Jprofiler和IBM工具的实际体会achine》:半部分有约四章我认为非常棒,其它章节可能意义不大。《TheJavaVirtualMac
3、hineSpecification,2nd》:前半部分有两三章很不错,不过可以对照上一本书看。sun的hotspot虚拟机技术:javase/technologies/hotspot/BEA的JRockit虚拟机技术:jrockit/geninfo/genintro/index.htmlJVM技术文档入口,虚拟机理论,内存泄漏诊断等的索引页。IBM诊断资料:developerony。它们都实现了JVM规范,但有各自扩展。譬如,针对IBM虚拟机的堆碎片导致OutOfMemory(OOM),在Sun的虚拟机上就
4、不会发生。Sun的JVM有maxPermSize的概念,IBM就没有,如果你设置这个参数,虚拟机根本就启动不了。比较有意思的是,学Java,就一定要了解各种规范,这和MS的风格很不一样。Sun总是在定义一些规范,实现都留给各厂商。我们除了理解规范本身外,一定要理解规范和实现之间的关系,譬如JDBC规范和JDBC驱动的关系,它们是怎么组合到一起的。要是你用过php的xml解析库,或db函数,就会体会深刻,它们可没有什么规范可言,所以每个数据库厂商的db函数用法都不一样。我推荐大家研读一下HSQLDB的jdbc
5、和Tomcat的servlet相关实现,因为我认为它们还是比较好懂的。JVM规范只是定义一个虚拟机该做什么,但它并没有要求你该怎么做。例如我们最常见的Servlet规范,在该规范中,有HttpServletRequest、HttpServletResponse,HttpSession等接口,但它们的实现都留给了各个容器厂商。遗憾的是,规范留下的空白,会把我们这些开发人员给整惨了:容器间移植有时候就是恶梦。譬如J2EE并没有SSO规范,但它很重要,我以前专门针对它做过的结构从功能上分,Java虚拟机主要由六个
6、部分组成,可以分成三类:第一类:JVMAPI:就是我们最常用的JavaAPI,它是开发人员和Java交互的入口,它主要是JAVA_HOME/jre/lib下的运行时类库rt.jar和编译相关的tools.jar第二类:JVM内部组件类装载器(ClassLoader):将ByteArray的.class文件装载、链接和初始化。内存管理(MemoryManagent):为对象分配内存,以及释放内存。后者就是垃圾回收GarbageCollector(GC)。由于JVM最复杂的、最影响性能的就是GC,所以内存管理一
7、般就指垃圾回收。诊断接口(DiagosticsInterface):这主要体现在JVMTI(jdk1.4下的JVMPI和JVMDI),它主要用来诊断程序的问题和性能,一般提供给工具厂商实现。如eclisp123下一页....,。eIDE下的debug功能,Jprofiler性能调优工具。类解释器(Interpreter):解释装载进虚拟机的class对象,包括JIT等特性相关。第三类:平台相关接口(PlatformInterface):主要为了跨操作系统平台重用JVM代码,不过,它和我们开发人员关系不大。在
8、以上六个组件中,我们开发人员最关心的是ClassLoader和GC,用Java做系统框架、容器和它们密切相关。做业务系统时一些基础代码也和它们打交道,譬如最常用的Class.forName(),Thread.currentThread.getContextClassLoader()。我们仔细想想,为什么是上面两个问题?因为,它和我们class的整个生命周期最为相关:怎么将一个class和相关class加载进来,c
此文档下载收益归作者所有