I still can not find the solution. So I summary all the things and tell my boss about it. If any one knows the solution, please let me know.
Improve the garage collection (ReportThread.class) for the objects– reduce the JRTemplateElement instances if they are not in use
Symptom:
1.
The JVM became Out of memory when creating big
consumption report
2.
Those JRTemplateElement-instances
is still there occupied even if I logged out the system
Reason:
1. There is a large number of JRTemplateElement-instances cached in
the memory
2.
The
clearobjects() method in ReportThread class has not been triggered when logging
out
Action I tried:
About
the Virtualizer:
1.
Replacing
the JRSwapFileVirtualizer with JRFileVirtualizer
2.
Not use
any FileVirtualizer for cache the report in the hard disk
Result: The japserreport
still creating the a large number of JRTemplateElement-instances in the memory
About
the work around below,
I
tried: item 3(in below work around list) – result: it helps to reduce the
size of the JRTemplateElement Object
Item 4,5 – result : it helps a lot to reduce the number of
JRTemplateElement Object, and mitigate the symptom a lot
Solution: not found so far,
this bug has been report since 2008
Work around(as per our
discussion):
1.
Add new options AMR_Interval(KVA,KVAH or all
features) in the web UI and limit the time period depends on option user
select(e.g. for kVA,kVAH – within 3 Months, for the all features within 1
month)
2.
Limit the time period depends on the number of
meters(e.g. for 1000 meters , only one month something)
3.
Removing the fancy features for the
report field(e.g. not border lines) - to reduce the size of JRTemplateElement instances
4.
Removing the headers(just for exporting
correct headers in CSV file) – to reduce the number of JRTemplateElement instances – will introduce csv non-header
problem)
5.
Don’t create JRTemplateElement when the content is blank - to
reduce the number of JRTemplateElement instances –
will introduce csv in-correct format problem)
6.
Set
net.sf.jasperreports.governor.max.pages) to stop the report execution
when the report becomes greater than this value– will prevent system from
running out of memory
7.
Only display the data after the meter has been
registered(e.g. meter A has been registered on Dec 27,2010, when use select Nov
27 ,2010 as the start date, we only display data from Dec 27
) – to reduce the number of JRTemplateElement instances
Increase the max memory
for the JVM(now it’s 512M) – to keep more JRTemplateElement
instances in the memory
Improve the garage collection (ReportThread.class) for the objects– reduce the JRTemplateElement instances if they are not in use
The solution for above item 4 and 5:
Use the new csv export features from jasper report
v4.0.0 (net.sf.jasperreports.export.csv.write.header,
net.sf.jasperreports.export.csv.column.name,net.sf.jasperreports.export.csv.column.names)
Comments: the new feature works and make the codes simpler
Related Technologies:
ReplyDeletejava -Xmx option is used to set the maximum heap space available to a Java program