来自:simsky > 馆藏分类
配色: 字号:
FineReport性能问题处理方法总结
2017-05-16 | 阅:  转:  |  分享 
  
性能问题处理方案汇总性能问题主要分为两个方面:1、服务器内存溢出;2、预览时,整个报表加载速度慢或者控件加载时间长。一、服务器内存溢出问题从
我们的报表可以集成的服务器和客户那边比较常用的服务器环境来看,主要有Tomcat服务器、Weblogic服务器、WebSphere
服务器和JBoss服务器,就我平时处理性能问题遇到的服务器主要有tomcat服务器,暂时没遇到后面三种服务器内存溢出的问题,今后遇
到了再加进来。故我主要整理一下tomcat服务器内存溢出的处理方法,其他服务器的处理方法先借用文档中增加内存的方案:Weblogi
c服务器:http://www.finereporthelp.com/help/4/3/0/0/1.htmlWebSphere服务
器:http://www.finereporthelp.com/help/4/3/0/0/2.htmlJBoss服务器:http:
//www.finereporthelp.com/help/4/3/0/0/3.html顺便提一下,我们设计器的内置jetty服务
器的内存也可以修改,但是一般不会去增加这个服务器的内存,修改的地方为安装目录下bin文件夹中的designer.bat文件中..\
jre\bin\java-Xms512m-Xmx1024m修改一下-Xmx后面的值即可。下面详细介绍一下tomcat服务器内
存溢出的原因以及一般处理方法。(一)、tomcat内存溢出的原因tomcat内存设置不好的话很容易出现内存溢出,造成内存溢出的原因
不同的话,处理方式也不同。我遇到过的内存溢出的有三大方面:OutOfMemoryError:Javaheapspace(堆溢
出)OutOfMemoryError:PermanentGenerationspace(内存的永久保存区域溢出)OutOfMe
moryError:unabletocreatenewnativethread(无法创建新的线程)堆溢出:JVM堆的设
置是指java程序运行过程中JVM可以调配使用的内存空间的设置。JVM在启动的时候会自动设置Heapsize的值,其初始空间(即
-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xms-Xmx等选项可进行设置。H
eapsize的大小是YoungGeneration和TenuredGeneraion之和。在JVM中如果98%的时间是
用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。HeapSize最大不要超过可用物理内存的80%,一般的要
将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。堆的大小主要受三方面的影响:(1)、操作系统的位数:32位操作
系统下,JVM最大内存在1.5G至2G之间,实际可用的一般小于1.5G;64位操作系统对内存无限制。(2)、系统的可用虚拟内存限制
;(3)、系统的可用物理内存限制。其中(2)、(3)一般不考虑。内存的永久保存区域溢出这是由于这块内存主要是被JVM存放Class
和Meta信息的,Class在被Load的时候被放入PermGenspace区域,它和存放Instance的Heap区域不同,G
C(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的程序会LOAD很多C
LASS的话,就很可能出现PermGenspace错误。这种错误常见在web服务器对JSP进行precompile的时候。如果
你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。解决方案:Linux服
务器:在catalina.sh的第一行增加:JAVA_OPTS=-Xms64m-Xmx256m-XX:PermSize=128M-
XX:MaxNewSize=256m-XX:MaxPermSize=256m或者在“echo"UsingCATALINA_BA
SE:$CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server-XX:PermSize=64M
-XX:MaxPermSize=128mWindows服务器:在catalina.bat的第一行增加:setJAVA_OPTS
=-Xms64m-Xmx256m-XX:PermSize=128M-XX:MaxNewSize=256m-XX:MaxPe
rmSize=256m无法创建新的线程这种现象比较少见,主要原因是:每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操
作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩
下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也
会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的150
0M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下4
00M的可用内存里边我们最多也只能创建400个可用线程。jdk不同的话,每个线程占用的内存量也不一样,不深究。但是有一点要记住:给
JVM内存越多,那么可创建的线程越少,越容易发生java.lang.OutOfMemoryError:unabletocre
atenewnativethread错误。给出一个有关能够创建线程的最大个数的估算公式:(MaxProcessMemory
-JVMMemory-ReservedOsMemory)/(ThreadStackSize)=Numberoft
hreads对于jdk1.5而言,假设操作系统保留120M内存:1.5GBJVM:(2GB-1.5Gb-120MB)/(1MB)
=~380threads1.0GBJVM:(2GB-1.0Gb-120MB)/(1MB)=~880threads解决
方案:如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,T
hreadStackSize这三个因素,来增加能创建的线程数:a,MaxProcessMemory使用64位操作系统b,JVM
Memory减少JVMMemory的分配c,ThreadStackSize减小单个线程的栈大小这三种内存溢出现象,后两种比较少见
,一般遇到了按照上面的解决方案处理就可以了,第一种情况比较常见,一般outofmemory的问题是因为客户某一张或某几张的数据量特
别大或者模板制作得非常复杂,需要占用很大内存的时候,才会出现溢出,一般溢出都是javaheapspace错误,所以下面对堆溢出
问题的处理办法做详细的描述。(二)、两大主要操作系统下,修改安装版和解压版tomcat的内存并配置溢出文件的方法(以tomcat6
.0为例)Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。下面介绍下客户主要会用到的
两大系统中tomcat内存设置的方法。1、windows操作系统:(1)、安装版的tomcat6.0进入TOMCAT的安装目录下的
bin目录,双击tomcat6w.exe。点击Java选项卡,可设置初始化内存,最大内存,线程的内存大小。-Xms512m-Xmx
1024m-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=D:\heapdump注
意:要分行写,都是以“-X”开头的,不然识别不出来。内存溢出时会向D盘的heapdump文件夹中写入东西。(2)、解压版的tomc
at6.0进入TOMCAT的安装目录下的bin目录,右击catalina.bat文件编辑,在文件的开头输入SetJAVA_OPT
S=-Xms512m-Xmx1024m-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDump
Path=D:\heapdump注意:这个不需要换行,同样溢出的时候,会向D盘的heapdump文件夹中写入东西。有时候在开头加不
一定会起作用,是因为在下面已经对tomcat的内存有定义了,那么tomcat在启动的时候会以下面的内存大小为准,所以要找到JAVA
_OPTS看一下它后面的是不是对内存进行了定义。设置完之后如何查看tomcat的内存:1、启动tomcat2、访问http:/
/localhost:8080/manager/status,并输入您在安装tomcat时输入的用户与口令,如admin,密
码admin(密码是您在tomcat安装时输入的)注:添加用户,修改conf/tomcat-users.xmlsion=''1.0''encoding=''utf-8''?>t"/>lename="admin"/>"tomcat"/>role1"/>
<
/tomcat-users>3、进入了ServerStatus页面,可以在JVM表格中看到?Freememory:241.8
0MBTotalmemory:254.06MBMaxmemory:508.06MB上面的文字即代表了,当前空闲内
存、当前总内存、最大可使用内存三个数据。确定了最大内存足够大时,tomcat即可正常运转2、Linux操作系统:解压版的tomca
t(暂时只处理过解压版的问题):要添加在tomcat的bin下catalina.sh里,文件的最前面加上JAVA_OPTS=
"-Xms1024m-Xmx8192m-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDump
Path=.\heapdump"注意:溢出文件存放的位置就在根目录下建一个heapdump文件夹。(三)、获取溢出文件后分析当按照
上面的内存配置方法给用户配置之后,只要等客户那边溢出就好了(这里面内存大小的配置不能说为了获得溢出文件,故意把内存配得很小,这是不
对的,需要根据用户实际系统的内存以及报表的数据量分配合理的内存,然后等待溢出,如果不溢出,一段时间后比较稳定,再根据之前客户设置的
内存大小来确定溢出的原因,基本都是客户没有配置内存,即使用tomcat默认大小的内存),获取溢出文件后,拿过来,用JProfile
r工具进行分性就可以了。JProfiler软件的功能还是比较强大的,我们可以用这个软件查看报表的执行时间和占用内存的大小,也可以查
看报表中的SQL语句或者某个方法、某个类的执行时间。下面这张图是打开客户的溢出文件后显示的界面,如图1。图1如果直接在里面找,是很
难找到的,但是我们知道我们的报表执行的情况主要是在ReportSessionIDInfo类中可以看到。所以第一步是CTRL+F搜R
eportSessionIDInfo类,如图2。图2然后双击进入这个类,里面就是一个个Info对象,选Outgoingrefer
ences,按大小排序,如图3。图3图中,每个ReportSessionIDInfo对应一个打开的模板,点开一个ReportSes
sionIDInfo,bookPath即模板名称,模板参数在parameterMap4Execute里。如图4。图4当上面的方法找
不到大模板时还有一些是正在计算的,此时看到的ReportSessionIDInfo大小较小,但很有可能就是这些模板导致的内存溢出点
packages,展开core.A选择A.F[][](这个名字是混淆过的,每个版本名字不一定一样,但带有[][]基本可以确定)展开
里面的A.F,在展开里面的A.r[],如果A.r比较多,则选择A.r[]看看RetainedsizeA.r[]的Retained
size/4可以估计有多少行,如4000kB/4=1000,000b,有100万行返回到A.F[][],选Incomingre
ferences,找到A.I通过A.I里面的Calculator类可以找到模板名。基本上分析溢出文件的工作都是唐总做的,通过上面的
这一流程下来就可以确定问题在哪里了。如果溢出原因是模板的数据量太大,但是客户用的是行式引擎,那就只能建议客户增加内存了;如果溢出原
因是模板制作太复杂导致加载的时候占用内存太多的话,向客户要模板,简化模板;如果溢出原因是SQL语句太复杂,就协助客户简化SQL。二
、预览加载时间长,未溢出平时客户那边这种情况也是非常普遍的,预览时加载时间长的原因有很多,比如:数据量大、模板制作复杂、SQL执行
时间长、数据连接问题、浏览器执行语句的问题等。这类问题基本都是使用IE浏览器出现的,尤其是IE8和IE9。根据我之前处理过的一些问
题,我做一下整理。其中有一个问题是IE9浏览器下,点击查询按钮,加载慢的问题,原因有两个,一是确实客户的数据量大,虽然行数只有几百
行,但是列数很多,80到100列,IE浏览器加载要4、5分钟,唐总研究之后发现是IE页面处理方法导致页面加载慢。IE浏览器是进到<
html>里面执行js的,修改一下代码,使浏览器直接执行js就可以了,这是IE浏览器执行机制的问题。改了之后加载时间在9秒左右,这
个客户可以接受,但是加大数据量后就变得很卡,自己看了客户的模板,发现客户设计的模板有两个相同的sheet,近9000行60列的数据
量,两个sheet就要执行两边,时间肯定会很长,而且同样的模板,分页预览比数据分析和填报预览的时间少了一半,这就是客户模板制作和预
览方式选择的问题。还有一个问题是IE8浏览器下填报,插入行后填报时单元格之间的焦点切换导致页面卡死。仔细看客户模板后发现,原来客户
十个左右的单元格控件都设置了编辑后事件,这样的话每编辑一次,就要执行10次,在IE8浏览器下肯定会很卡,帮客户找了替代方案,改成设
置整个模板Web属性的事件,功能一样,这样填报就不卡了,这就是客户设置模板的时候没有注意事件的执行次数的问题。所以遇到这类预览加载
时间长却并没溢出的问题,在确定数据量的基础上,主要还是分析客户模板的设置,看到底是哪边导致加载时间过长,对症下药。问题解答:1、浏
览器会不会存在内存溢出的情况?比如后台提交了大量的数据到浏览器端,然后浏览器运算的时候数据量太多跪掉了是会存在的,这种情况主要出现
在360浏览器和低版本的IE浏览器中。如果是设计器预览展示数据的时候出现这个问题,从我们的软件出发解决方案主要是行式引擎,从浏览器
出发我们可以看一下是浏览器的什么模式下出现这个问题,看一下Firefox、chrome和高版本IE(如IE10、11)是否也存在这种情况。其实这个主要是浏览器的承载问题。2、如果访问报表的时候已经有内存溢出的报错了,那么这时候中间件比如tomcat理论上会处于什么样的状态呢?还是能够提供正常的服务来响应请求么?还是说处于瘫痪状态?如果页面有内存溢出的报错,那么服务器就直接处于瘫痪状态;如果页面一直加载不出来,服务器报内存溢出但是页面仍然在加载,那么服务器也是处于瘫痪状态,而且会不停地报错。两种情况下服务器都不能用于别的报表的访问。3、性能问题还有一种情况,可能某个时候内存会涨到很高,但是不一定就会报错溢出,这时候想要找到对应的性能问题模板,有什么办法吗?这种情况是存在的。我们可以有两种处理方案:1、引导客户在运行报表的时候查看内存使用情况,当内存涨到很高但未溢出的时候,看一下是哪张模版在执行什么操作引起的;2、我们进行处理,将服务器的内存调低,使溢出产生,获得溢出文件,进行分析定位原因。
献花(0)
+1
(本文系simsky首藏)