2012-12-05 89 views
1

我們有一個Jenkins作業來測試我們的應用程序。執行時,我們會在執行我們的目標時使用着名的OutOfMemoryError,並使用以下代碼片段生成junitreport。從ANT運行junitreport時出現OutOfMemoryError

 <junitreport todir="${tmp.dir}/reports-test-shared"> 
      <fileset dir="${tmp.dir}/reports-test-shared"> 
       <include name="TEST-*.xml" /> 
      </fileset> 
      <report format="frames" todir="html" /> 
     </junitreport> 

我們得到的確切堆棧跟蹤如下。

/app/ci/jenkins/jobs/FLEETperfect Trunk Junit Test MOS/workspace/trunk/com.bsiag.fleet.build/build.xml:818: java.lang.OutOfMemoryError: Java heap space 
    at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:205) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(XMLEntityScanner.java:1380) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanCDATASection(XMLDocumentFragmentScannerImpl.java:1654) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2986) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:180) 
    at org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator.createDocument(XMLResultAggregator.java:254) 
    at org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator.execute(XMLResultAggregator.java:144) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:392) 
    at org.apache.tools.ant.Target.performTasks(Target.java:413) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:811) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 

編輯:在我們的build.xml 818線以上

所示的junitreport任務我已經看過一些在其他SO問題,如hereherehere給出的建議。

最常給出的建議是在JAVA_OPTS

  • 增加-Xms和X毫秒
  • 增加XMX和X毫秒在ANT_OPTS

這是我迄今所做的:

  • 將env變量JAVA_OPTS設置爲「-Xms512m -Xmx2048m」
  • 設置環境變量ANT_OPTS爲 「-Xms512m -Xmx2048m」
  • 在tomcat的/ bin目錄
  • 創建setenv.sh在那裏我做:出口JAVA_OPTS = 「$ JAVA_OPTS -Xms512m -Xmx2048m」
  • 新增「-XX: MaxPermSize = 256m「來設置變量JAVA_OPTS和ANT_OPTS

我的問題如下。我不知道我做的內存設置是ANT用來運行報告生成的內存設置(junitreport)

我必須增加堆大小才能讓junitreport終止OutOfMemoryError?

+1

這不完全是一個詹金斯的問題..我已經重申爲您找到合適的專家 –

+0

這是在build.xml中的818行junitreport任務嗎? –

+0

@PulakAgrawal:謝謝! – Tobias

回答

1

嘗試設置如下的junit ant目標的選項:maxmemory;

<junit maxmemory="512m" fork="true"> 

注意的是,根據documentation您需要設置叉=「真」爲了使maxmemory元素JUnit的Ant目標才能作出。否則會被忽略。

+0

對不起,我沒有提到我們不使用junit任務來測試,而是使用pde.launch.test.product。 – Tobias

0

請嘗試加入,

-Xms512m 
-Xmx1024m 
-XX:MaxPermSize=256m 
+0

您的意思是明確地將堆大小設置爲該值還是將其設置爲一般?我設置了MaxPermSize,但沒有幫助。 – Tobias

5

像這樣的問題可能使用另一種方法來固定。我試圖找出造成這麼大的空間需求的原因,而不是增加堆空間。我發現了一個爲sysout寫了大量信息的測試。這導致產生的xml文件大於200mb。對於2或3 GB的堆大小顯然太大。

+0

我發現了類似的東西。其中一項測試尤其是輸出了太多跟蹤信息,導致junitreport任務失敗。關閉痕跡解決了這個問題。如果由於某種原因在稍後的時間測試失敗,那麼打開調試行爲的痕跡是件微不足道的事情。 – PKCLsoft

1

此錯誤已在ANT bug 34342中提出。普遍的共識是,這是由用於生成報告的XSLT中的內存消耗過多造成的,並且它不會在ANT中修復。

了什麼工作對我來說是增加傳遞給螞蟻最大堆大小,如-Xmx3304m

在詹金斯可以將最大堆大小傳遞給ANT在InvokeAnt>高級> JavaOptions 和添加類似-Xmx2000m

關於實際的最大堆大小值,建議它應該是物理內存的1/4或1GB,以較小者爲準。但是,您可能需要超出1GB限制以避免此內存錯誤。請參閱Oracle網站上的Garbage Collector Ergonomics指南。

相關問題