2010-10-26 107 views
5

我目前正在嘗試使用哈德森構建我的項目來調用maven。我不斷收到出於記憶錯誤的問題。我在所有環境變量,哈德森配置和哈德森項目配置中設置了xmx和xms。我將xmx設置爲1500 mb,這應該足以滿足整個項目小於1000mb的需求。用於構建項目的機器是存儲該團隊的Maven回購的服務器。奇怪的Maven內存不足錯誤

任何人都遇到了同樣的問題?任何想法如何發生?

+0

您是否確認更改xmx/xms的確適用? – kukudas 2010-10-26 20:07:06

+0

我該怎麼做? – Javabeginner 2010-10-27 09:40:56

回答

6

謝謝大家的回答我的問題。我已經通過堆轉儲和分析解決了這個問題。我通過傳遞以下虛擬機參數進行堆轉儲:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/

然後我用Eclipse Memory Analyser打開java_pidxxxxx.hprof文件。

我發現我們用來捕獲異常的偵聽器無法捕獲異常。所以例外情況會留在虛擬機中,因此內存泄漏!

再次感謝所有的答案

0

假設你使用的是Sun的JDK,然後在哈德遜/管理哈德森/ Maven項目配置/全球MAVEN_OPTS設置如下:-Xmx512m -XX:MaxPermSize參數=256米

+0

我已經完成了。 – Javabeginner 2010-10-26 14:47:01

+0

從您的描述中不清楚你使用了哪些選項。這一切都區分大小寫,你需要精確。這將有助於查看您正在收到的確切錯誤文本,例如它來自Hudson,是Maven發佈的一個子進程的主Maven進程,用於運行測試和其他內容。 – 2010-10-26 14:54:31

0

哈德森揭開序幕單獨的任務來運行Maven工作。您需要在MAVEN_OPTS文本字段中配置增加的內存。該字段位於各個作業配置窗口中。

編輯:繼續您的意見。你是偶然分叉你的編譯,運行它在一個單獨的執行或叉你的junit測試。

嘗試在你的編譯器配置(假設你有一個):

<maxmem>512m</maxmem> 
+0

我已經完成了。 – Javabeginner 2010-10-26 14:47:48

+0

@Javabeginner看看我的編輯。也許這些信息可以幫助。 – 2010-10-26 15:43:05

+0

感謝您的更新,我確實嘗試運行構建與睾丸分離,顯然構建運行良好沒有睾丸,我認爲這是導致內存不足錯誤的測試。通過說睾丸,我們使用maven surefire插件來運行這些睾丸。我剛剛閱讀了一篇文章,說Hudson,Maven,JBoss甚至窗口(運行我的服務器的操作系統)都可能無法支持xmx配置。我只是加倍檢查,服務器有4GB內存和XMX設置爲1500MB。編譯器配置?這是否意味着我的案例Maven配置? – Javabeginner 2010-10-27 09:40:34

1

一定要確保你有足夠的MaxPermSpace。我遇到了分配給JVM的內存已足夠的問題,但OutOfMemoryError是由於PermSpace耗盡。當我們處理編譯代碼時,這並不罕見 - 尤其是編譯代碼,丟棄和重新編譯時。有關調整垃圾收集器(和內存)的更多信息請查看這些參考資料:

在第16-17頁的內存管理白皮書,它概述了可能的原因OutOfMemoryError異常。另一個防禦是分叉maven進程和/或編譯器。

+0

我確信,我得到的內存不足錯誤是不相關的permgen空間,因爲我們實際上從這個錯誤從permgen空間錯誤 – Javabeginner 2010-10-26 16:34:37

+0

移動這是很難排除故障系統沒有直接讓我的手。我鏈接的文檔是否幫助您找出要嘗試的事情?你很可能將不得不在分析垃圾收集器的同時運行它來幫助你找到原因。文檔告訴你如何做到這一點。 – 2010-10-26 18:36:49

11

如果您在測試過程中獲得的OOM,那麼你必須告訴萬無一失插件一個新的虛擬機進行了檢測:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.5</version> 
    <configuration> 
     <forkMode>once</forkMode> 
     <argLine>-Xms512m -Xmx512m</argLine> 
    </configuration> 
</plugin> 
+0

我剛剛在使用Vision VM的模塊上完成了Java分析,通過將配置文件與其他模塊進行比較,失敗的模塊似乎有很多睡眠線程,而其他模塊沒有。這是內存不足錯誤的原因嗎? – Javabeginner 2010-10-27 13:11:54

+1

我們必須這樣做,因爲我們很多舊的單元測試沒有清理他們使用的線程和其他資源。當我們詢問螞蟻腳本的作者時,他告訴我們分叉一個新的vm而不是固定單元測試更容易。 *感嘆*這麼多的技術債務。 – dhable 2010-10-27 20:09:26

+1

@Javabeginner:可能。您必須關閉所有文件,將所有引用設置爲null,並將其測試在tearDown()中使用的任何內容清理乾淨:JUnit將爲您的測試類*創建一個實例,並保留它們,直到所有測試都運行完畢。 – 2010-10-29 15:47:40

0

我得到了同樣的問題。當試圖對代碼進行測試時,哈德森(或JVM)會拋出內存不足。解決方法是:在configuration of plugin cobertura-maven-plugin中,使用<maxmem>512m</maxmem>