我有一個名爲SrcFile
和一個其列的實體類是:爲什麼此代碼運行速度越來越慢?
@NotNull
@Lob
private Byte[] data;
這SrcFile
與報告實體OneToOne關係。
從Report.java:
@OneToOne
private SrcFile srcFile;
堅持一個SrcFile
實體的偉大工程。
srcFileHomeFacade.clearInstance();
SrcFile srcFile = srcFileHomeFacade.getInstance();
byte[] bArray = resource.getBytesForSource();
srcFile.setData(ReportFileResource.toObject(bArray));
System.out.println("````````````````srcFile data length: "+bArray.length);
srcFileHomeFacade.persist();
問題出在我堅持Report
。
我做的:
report.setSrcFile(srcFile);
reportHomeFacade.persist();
和作品不錯,但多次運行此代碼它變得越來越慢後(即使它引發GC開銷錯誤)和調查的時間後,我發現,這report.setSrcFile(srcFile)
是問題。
不知怎的,報告不喜歡引用的srcFile.data
這樣的量......
你看到的原因是什麼?
如果我評論report.setSrcFile
所有的作品都很好(除了報表中的SRCFILE_ID將爲空,但它僅用於測試)。請注意,數據的長度約爲100.000。
注意:如果我沒有堅持任何report
但只有srcFile
實體我沒有問題。 UPDATE:
「運行慢」解釋:這段代碼被稱爲轉換一些PCLS爲PDF因此data
包含PCL的來源,每次都不同了。轉換大約100 pcls後,這個過程變得越來越慢,並且使用虛擬機,我發現了需要大量MB內存的byte []數組。同樣,這絕對不是IO問題,而是關於報告實體上的setSrcFile,VisualVM也指出了這一點。
我會說,因爲它的Java:p – ThiefMaster 2011-04-19 22:39:03
@ThiefMaster:非常有幫助;) – weltraumpirat 2011-04-19 22:42:16
請澄清:當你說「多次運行」時,你的意思是:你多次堅持同一個實體嗎?只有在持續或讀取數據時,程序運行速度是否會變慢?在寫數據的時候你會運行讀操作嗎?你是否在同一份報告中設置了不同的文件,或者它總是與一個報告一樣的srcFile?你設置CascadeTypes嗎?你使用懶惰或渴望加載? – weltraumpirat 2011-04-19 22:50:15