簡體   English   中英

Java堆多線程優化

[英]Java Heap Multithreading Optimization

我正在編寫一個Java程序,該程序在不同的線程中同時運行許多模擬,並將結果平均在一起。 我想運行許多模擬,而不是同時運行,因此我想同時運行盡可能多的模擬,而不會耗盡內存並使其余部分“排隊”。

有沒有一種簡單的方法來確定線程使用的最大堆內存?

有沒有一種簡單的方法來檢查運行時正在使用多少堆內存,因此我只能在內存打開時啟動新線程?

PS:我是優化多線程應用程序的新手。

分析您的線程,以確定占用了多少堆。 我不知道以編程方式執行此操作。

使用的線程不要超過核心數量。 創建新線程是一項相對昂貴的操作,而創建太多線程實際上可能導致您的應用程序運行更慢。 如果您正在處理大量數據,或者需要非常低的延遲,那么您確實要避免創建許多線程。

我建議研究ExecutorService 創建一個與模擬計算機上的內核數相等的固定線程池。

編輯:

從Java 1.4開始,我們提供了以下功能:

int cores = Runtime.getRuntime().availableProcessors();

試試這個,用cores線程創建一個固定的線程池。 這將使您的應用程序可以在內核不同的機器之間擴展。

請注意,這是邏輯核心的數量,因此,借助英特爾的超線程功能,每個處理器將計為2個“核心”。 仍然是一個很好的衡量。

VisualVM中監視程序時,可以使用一個線程運行該程序,然后可以使用兩個線程,然后使用三個線程。 內存使用率和垃圾回收頻率的差異可以使您了解單個線程使用多少堆內存,以及不同線程之間共享的對象占用了多少內存。

這不是一件容易的事,但是有一些方法可以做到。 jvm通過管理API公開當前的內存使用情況。 您可以使用MemoryMXBean和MemoryPoolMXBean來訪問當前的jvm內存狀態。

暫無
暫無

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

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