2015-09-17 51 views
0

我開發了一個java程序,我已經在遠程機器上部署了它,並安裝了最新的jre1.8.0_60。我使用jdk1.8.0_60開發了這個程序。我測試了我的機器(內存6GB-64bit)和我的同事電腦(內存8GB-64bit)上的程序,程序執行時沒有任何問題,但是當我在遠程機器上執行相同的程序時(內存4GB-64BIT)這個錯誤:OutOfMemoryError:遠程Windows計算機上的Java堆空間

java.lang.OutOfMemoryError: Java heap space 
    Dumping heap to java_pid3696.hprof ... 
    Heap dump file created [217326007 bytes in 2.721 secs] 
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOfRange(Unknown Source) 
    at java.lang.String.<init>(Unknown Source) 
    at java.lang.StringBuilder.toString(Unknown Source) 
    at Invoice.GetInvoicesByStatusAndDate(Invoice.java:66) 
    at ClientSAAJ.GetInvoicesByStatusAndDate(ClientSAAJ.java:75) 
    at ClientSAAJ.main(ClientSAAJ.java:10) 

難道是沒有足夠的內存,或者我有執行某種java配置嗎?

+0

兩者都可以。或者,也許你將不同的數據傳遞給服務器上的程序(也許是大數據庫)。但正如我從堆棧跟蹤中可以看到的,你正在構建一個大的'String'(它變得非常大,所以最好避免這麼做)。也許最好從'Invoice.GetInvoicesByStatusAndDate(Invoice.java:66)''顯示代碼'找到問題的根源 –

+0

@НиколайМитропольский你是對的,它是一個很大的XML字符串,但我也有另一個類,幾乎相同但這個班的工作很好。我會很快把代碼。 – Niki

+0

一般來說,如果您要將數據從數據庫傳送到RAM(例如,如果您正在讀取數據庫中的所有實體並將它們寫入* String-in-RAM *中),則遲早您將耗盡內存。所以如果你想將數據庫內容轉換爲XML,那麼直接將XML寫入文件而不是String。 –

回答

0

您的程序沒有足夠的內存來運行。您可以使用-Xmx jvm選項設置最大堆大小。

例如如果你的程序是一個可執行的JAR,分配最大80MB你可以使用

$java -Xmx80m -jar executatable.jar 

瞭解更多信息

+0

如果我的遠程機器只有4GB,我可以分配多少錢?因爲我沒有多少我的班級需要當我執行它, – Niki

+0

那麼你可以在技術上分配非常接近4GB留下內存的操作系統來操作。但除非您正在研究數據密集型應用程序,否則不建議這樣做。你有沒有嘗試分析你的應用程序?我建議你也看代碼,看你的程序是否可以處理進入的數據而不會耗盡內存。開始的一個好的方面是當程序崩潰時你得到的「java_pid3696.hprof」轉儲。 – kadian

+0

我設法解決了我剛剛分配1028的問題,併發揮了作用。僅供參考,我沒有下載數據轉儲,但到那時我已經解決了這個問題。感謝您的反饋意見。 – Niki

相關問題