簡體   English   中英

JAVA多線程,內存泄漏,垃圾收集器

[英]JAVA Multi-Threading, Memory Leak, Garbage Collector

在JAVA應用程序方面,我有點新手,但是他參與開發了一個需要多線程的相當復雜的JAVA(8)應用程序。 我自己和另一個開發人員一直遇到一個問題,即運行一段時間后應用程序內存不足。

起初我們給應用程序提供了64GB的內存,但幾個小時之后就會耗盡內存,崩潰並重新啟動。 只是一遍又一遍地做。 上下文; 應用程序從消息傳遞系統(ActiveMQ)獲取消息,並且消息的元素必須通過調用值的各種數據源來構建XML文件。 可能有數百萬條消息需要處理,因此我們開發了一個多線程系統,每個線程處理一條消息 - 並為應用程序提供40個線程。

但是,由於它不斷收集消息,因此整體內存消耗會隨着時間的推移而上升。 我覺得我們沒有正確使用垃圾收集器?

所以目前我們有一個父線程:

(new Thread(new ReportMessageConsumer(config, ""))).start();

然后在ReportMessageConsumer中我們設置了X個線程,所以在我們當前的設置中這將是40。 所以這將屬於這一組。 一旦構建了XML並完成了線程,我們如何有效地殺死線程並強制執行垃圾收集器以釋放該內存,以便我們可以創建一個新的干凈線程來獲取另一條消息?

我覺得我們沒有正確使用垃圾收集器?

那不是問題。 你能做的最好的事情就是讓GC做到沒有任何干擾。 不要試圖強制GC運行。 它很少有用,而且通常對性能不利

真正的問題是你有內存泄漏。 它可能正在發生,因為你獲得越來越多的線程......或者它可能是其他東西。

我會推薦以下內容:

  1. 重寫您的代碼,以便它使用ExecutorService來管理有界線程池,以及要在這些線程上運行的任務隊列。 查看javadocs以獲得一個簡單示例。

    使用線程池可能會提高應用程序的整體性能。 在Java中創建線程(即Thread.start() )相當昂貴。

    (並且不要關閉池以確保完成一批工作。這對性能不利。這樣做的簡單方法是使用invokeAll提交批處理;請參閱ExecutorService,如何等待所有任務完成 。)

  2. 如果這不能解決您的泄漏問題,那么請使用內存分析工具來了解應用程序泄漏內存的方式/原因。 有很多關於如何執行此操作的StackOverflow問答。 例如:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM