2010-05-28 481 views
26

我們有一個PHP webapp,它調用一個java二進制文件來生成pdf報告(帶有jasperreport),java二進制outpus pdf到標準輸出和退出,然後將php發送到瀏覽器。這個java命令持續大約3到6秒,我認爲當它持續6秒時,這是因爲GC啓動了,所以我想禁用它,因爲無論如何當命令退出所有內存時都會返回。如何禁用Java垃圾收集器?

我想知道如何禁用它爲Java 1.4.2和Java 1.6.0,因爲我們目前正在測試兩個JVM,看看哪些執行得更快..

感謝

+7

只是暗示其他方法(因爲流程啓動也需要時間):http://github。com/hudora/pyJasper包含一個(java)服務器,它可以根據請求運行jasperreports,而不需要啓動/關閉進程。 – ZeissS 2010-05-28 08:16:44

+0

相關的具體對象:http://stackoverflow.com/questions/1329926/how-to-prevent-an-object-from-getting-garbage-collected – 2015-03-04 08:08:24

回答

25

沒有辦法完全禁用垃圾收集。垃圾收集只在JVM空間不足時運行,因此您可以爲程序提供更多內存。添加這些命令行選項Java命令

-Xmx256M -Xms256M 

這給RAM的程序的256Mb(默認爲64MB)。垃圾收集對於默認大小的JVM不會花費3秒,因此您可能想要更仔細地調查程序正在執行的操作。 Yourkit profiler對於弄清楚需要很長時間的事情非常有用。

24

GC只踢當JVM是短暫的記憶,所以你要麼GC或死。嘗試打開詳細的GC並查看它是否確實需要大量時間。

java -verbose:gc 
+1

嗯,那麼也許我可以使用命令行開關給它更多內存,因此增加了GC未啓動的機會。 – Nelson 2010-05-28 08:00:47

+1

是的,在分析verbose:gc的輸出後,您會知道是否需要執行此操作。這是第一步。 – unbeli 2010-05-28 08:01:58

+6

+1爲「測試,不要猜測」。時間差異可能是完全不相關的東西,比如I/O爭用或某些CPU繁重進程。 – gustafc 2010-05-28 08:08:32

1

您確定它是垃圾回收導致放緩嗎?你用-verbose:gc運行java來看看發生了什麼?

您無法禁用JVM上的垃圾回收。但是,您可以查看tuning垃圾收集器以獲得更好的性能。

2

您可以使用-Xmx選項設置最大堆大小;使用更大的堆應該防止虛擬機運行內存不足,從而需要儘快進行垃圾收集。

+2

只需設置-Xmx就不會有任何區別。您實際上也需要設置-Xms,因爲您要控制初始堆大小。 – 2010-05-28 08:14:00

33

聽起來好像你正在努力節省時間,但是卻以錯誤的方式前進。與啓動和關閉java進程所用的時間相比,禁用垃圾回收所節省的時間將是微不足道的(對於單個任務)。如果運行時間性能是您的目標,您可能需要考慮進行java進程啓動,您可以多次提問以執行所需的工作。

+1

好的一個......我想,它也可以節省碧玉的初始化。 – helios 2010-05-28 08:15:20

+0

是的,這是一個很好的方法,雖然需要做更多的工作,但我必須編寫一種守護進程來監聽套接字,等等......除了這個「守護進程」之外,還必須在X天內重新啓動一次。 (從我的經驗)泄漏內存.. – Nelson 2010-05-28 08:20:55

+0

@Nelson考慮看看您是否可以使用像Mule這樣的東西來託管您的Java進程並讓它爲您處理所有通信。這個想法就是你只需要將你的JasperReports作爲一種服務嵌入,ESB可以根據需要將這些請求託管和路由。 Mule:http://www.mulesoft.com/mule-esb-open-source-esb – 2010-05-28 08:28:31

0

正如大家所說的,你不能在JVM中禁用GC,這是合理的,因爲如果你能夠存在內存泄漏,由於Java沒有明確的方式讓開發人員刪除堆數據。

您有權訪問此java二進制文件的源代碼嗎?如果是這樣,可能值得分析它,看看是否有任何瓶頸可以更好地寫出來減少GC活動。這可以使用大多數Java分析器完成,例如JProbe。

+0

java二進制非常簡單,它只是檢索命令行參數並調用jasperreport函數來創建報告,該報告傳遞給System.out outputstream,PHP通過「passthrough」函數讀取它。 所以花時間在Jasperreport上完成報告,多數民衆贊成我如何想java普遍加速。 – Nelson 2010-05-28 08:28:40

+0

看起來像控制JVM GC設置是您的唯一途徑。 – display101 2010-05-28 08:39:50

0

爲了避免垃圾回收器釋放任何對象的變量或屬性, 您必須將此屬性(由gc發佈)設置爲靜態類 這是我的解決方案。

示例:

private static String myProperty;