技术标签: web性能分析
转自 http://121.32.28.234:8800/kdwiki/index.php?doc-view-121.html
主要是为了自己学习HeapDump的分析,这是一篇好文章。
场景描述: EAS服务器运行一段时间后,客户端与portal登陆时,出现内存溢出的错误。有时甚至出现服务器直接宕机了,管理控制台也启动不了,客户端与portal都连接超时,必须使用EAS自带的stopserver.sh命令去终止服务器再重启。
解决思路:
内存溢出后,到EAS服务器目录:eas\server\profiles\server*\bin下,看是否有类似:heapdump.20110718.120928.3804.0010.phd和Javacore*.txt的文件生成。(注:默认情况下,如果使用sunjdk内存溢出时是不自动生成此类文件的,只有用ibmjdk才会自动生成。)如果没有找到此类文件,请切换EAS服务器使用ibmjdk,重启服务器后继续观察。(具体切换步骤请看附录2)。
ØHeap Dump:JVM内存Dump(HeapDump文件)。通过对它的分析可以快速诊断导致内存消耗的原因。Heapdump文件包含了在堆内存中的所有对象,可以理解为系统发生内存溢出(OutOfMemory,即OOM)时堆内存的快照。
ØJavacore:与heapdump对应的线程堆栈信息,一般通过对它的分析可定位到发生内存溢出的功能点。
ØHeap Dump分析工具:Heap Analyzer 下截地址:http://www.alphaworks.ibm.com/tech/heapanalyzer/download
一般情况下,解析heapdump文件需要64位的jdk,并要求机器内存>=4G。因此一般都需要用客户的测试服务器或服务器上进行解析,普通的PC机完成此项任务。
Ø工具准备好后,可到命令行下启动Heap Analyzer工具。
命令如下:C:\Kingdee7\eas\jdk\bin\java -Xmn512m –Xmx4000m -jar ha414.jar
(如果解析过程中内存溢出,可跟据实际情况调大–Xmx这个参数)
Heap Analyzer工具打开后,点击以下图标选择打开heapdump文件:
1、打开heapdump文件会消耗系统的CPU、内存资源,系统性能会有所下降。建议尽量不在客户正式环境执行!如果实在没有其他机器,正式环境资源充足,且问题比较紧急,可以尝试使用正式环境。打开分析完后及时关闭以释放资源。
2、在打开过程中,出现如下图形,说明工具设置的最大内存不够,不能打开该文件,需采用ibm jdk来设置更大的最大内存来打开
Root object:没有任何一个对象引用(持有)它
Parent object:对象A引用X,引用Y等(A—>X , A—>Y…),A就是父对象
Child object:对象X被A引用,被B引用等(A—>X , B—>X…),X就是子对象。
Owner object:因为子对象可能被多个父对象引用,但只能为其中一个父对象所有,这个父对象就是Owner object。Total size的计算会涉及到Owner object,这是为了避免重复计算
Size :对象自身的大小(持有该对象的指针在内存中占用的大小)
Total Size:对象自身及子对象的和
1,界面打开后初始状态如下,主要对tree view这个视图进行分析,可最大化这个视图
2 、tree view中每一行的结构如下:
TotalSize(占用总内存百分比)[对象自身大小]子对象个数对象名称内存地址
3、泄漏一般发生在那些拥有“超乎寻常多”的引用(子节点)的class上,正是这些创建后没有释放、累积了成千上百的对象,造成了OutOfMemory。通过“Locate a leak suspect”和“Go to the largest drop in subtrees”可快速定位到子对象多的对象位置。
4、通过“show from roots”可以回到根节点
5、 通过“List same type”可以列出所有在内存中和该对象相同类型的对象。
步骤2 右键展开上图中LRUMap对象,如下
步骤 3 对上图中的RowSetSqlDec对象右键点“List same type”,可看到该对象有3001个,共占用了700多M内存:
主要内存占用在如下三个部分
展开上述内存占用
与调拔入库单相关的对象(分录)占用了2百多兆
还是与库存相关的对象(单据头)相关占用1百多兆
与调拔入库单相关的对象共占用4百多兆内存,
分析javacore文件(用dump文件中的看到的关键字MoveInWareBill来搜索),摘取的线程堆栈如下:
at java/lang/String.toLowerCase(String.java:1143(Compiled Code))
at com/kingdee/eas/scm/common/app/AbstractSCMBillBaseControllerBean._getCollection(AbstractSCMBillBaseControllerBean.java:181)
at com/kingdee/eas/scm/im/inv/app/AbstractInvBillBaseControllerBean._getCollection(AbstractInvBillBaseControllerBean.java:174)
at com/kingdee/eas/scm/im/inv/app/AbstractMoveInWarehsBillControllerBean._getCollection(AbstractMoveInWarehsBillControllerBean.java:173)
at com/kingdee/eas/scm/im/inv/app/AbstractMoveInWarehsBillControllerBean.getMoveInWarehsBillCollection(AbstractMoveInWarehsBillControllerBean.java:161)
at com/kingdee/bos/transaction/EJBTxFacade/TxInvokerBean_LocalObjectImpl_2.INVOKE_SUPPORTS(Bytecode PC:4(Compiled Code))
at $Proxy591.getCollection(Bytecode PC:22)
at com/kingdee/bos/framework/DynamicObject.invoke(DynamicObject.java:57(Compiled Code))
at com/kingdee/bos/framework/DynamicObject.getCollection(DynamicObject.java:246)
at com/kingdee/eas/base/dap/app/DAPAppTools.execDataFilterMultiEntry(DAPAppTools.java:75(Compiled Code))
at com/kingdee/eas/base/dap/app/DAPTransformerControllerBean._innerTransform(DAPTransformerControllerBean.java:1028)
at com/kingdee/eas/base/dap/app/DAPTransformerControllerBean._transformForBotp(DAPTransformerControllerBean.java:1131)
at com/kingdee/eas/base/dap/app/DAPTransformerControllerBean._transform(DAPTransformerControllerBean.java:813)
at com/kingdee/eas/base/dap/app/DAPTransformerControllerBean._generateVoucher(DAPTransformerControllerBean.java:649)
at com/kingdee/eas/scm/common/app/SCMBillBaseControllerBean._generateVoucher(SCMBillBaseControllerBean.java:1057)
通过线程堆栈可以看出:调拔入库单生成凭证内存占用过大,导致溢出宕机
附录2:如何切换EAS的运行时环境?
在eas\server\profiles\server*\bin目录下,找到set-server-env.bat(sh)文件。将JAVA_HOME变量的值设置为imbjdk的路径。如果找不到JAVA_HOME这个变量,请直接添加。如下图:
分布式系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决1. 什么是单点登陆单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统2. 什么是CASCAS 是 Ya...
可能原因是maven的pom.xml依赖没有引入打包插件。注意:executions 的内容很重要!
Hive 大数据,仓库
在一个web项目的部署阶段,跳转页面的时候出现了如下问题,
tomcat中用記事本寫的類一定要javac之后tomcat才能正確調用﹐他不會自行編譯。
编译gstreamer 1.3.2 gst-plugins-base-1.3.2 gst-plugins-good-1.3.2 gst-plugins-bad-1.3.2 gst-plugins-ugly-1.3.2export PKG_CONFIG_PATH=/home/nap/xselib/sysroot-xse-j6-sgm358/usr/lib/pkgconfigexport
系统:win10 专业版安装程序:mysql-installer-community-8.0.16.0.msi提取码:w1g0安装教程:mysql installer community 8.0.16.0安装配置图文教程前提条件:A. 如果是重装的话,请先运行mysql-installer-community-8.0.16.0.msi 将所有的mysql 程序卸载(或在 控制面板>...
软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,那么,游戏即服务(Game as a Service)如何呢?已经有不少科技公司试水云游戏,最著名的要数Googl...
在BS的项目中,完成之后,都需要发布自己的网站。这个时候就要安装IIS了。 我也是最近才打算使用IIS来进行发布的。刚把IIS安装上,就遇到了问题。 出现问题就想办法解决问题呗。遇到的问题和视频里面的类似,他也讲了一下是如何解决的。不过,他的只是不显示图片。而我的是 图片和CSS样式都显示。错误的原因:路径与发布不一致。 检查了一下自己的代码,路径写错?
基于MVC框架的新闻信息管理系统MVC框架的简介 主流框架是MVC框架技术 - 1:jsp+servlet+javabean适用于较小的项目 - 2:Struts+Spring+Hibernate目前这是主流框架技术组合在一起就是SSH了 , 适用于要求可维护性强的框架技术- Struts主要负责表示层的显示- Spring利用它的IOC和APO来处理控制业务(负...
今天修改系统dbsnmp用户的密码的时候出现ORA-28003: password verification for the specified password failedORA-20006: P...
计算机使用二进制的原因计算机本质上是由逻辑电路组成,只有与门与非门,各种组合情况与二进制相同。二进制的运算比十进制、十六进制等都要简单,有利于简化计算机内部结构并提升运算速度。还有其他各种原因。表现我们平时使用时感觉不到二进制的存在:因为电脑会把我们输入的信息自动转为二进制,在计算机内部都是通过二进制形式存储运算的,输出的时候又是将二进制的数据转为我们能看得懂的信息显示在屏幕上,常用的Ascll码、汉字编码GBK、UTF-8等信息编码在电脑内部都是以二进制编码表示的,例如GBK编码的“国”这个