我正在编写一个 Java 程序,该程序在不同的线程中同时运行许多模拟并将结果平均在一起。我想运行很多模拟,而不是同时运行,所以我想同时运行尽可能多的模拟,而不会耗尽内存并将其余的“排队”。
有没有一种简单的方法来确定线程使用的最大堆内存?
有没有一种简单的方法可以检查运行时使用了多少堆内存,所以我只能在内存打开时启动新线程?
PS:我是优化多线程应用程序的新手。
我正在编写一个 Java 程序,该程序在不同的线程中同时运行许多模拟并将结果平均在一起。我想运行很多模拟,而不是同时运行,所以我想同时运行尽可能多的模拟,而不会耗尽内存并将其余的“排队”。
有没有一种简单的方法来确定线程使用的最大堆内存?
有没有一种简单的方法可以检查运行时使用了多少堆内存,所以我只能在内存打开时启动新线程?
PS:我是优化多线程应用程序的新手。
分析您的线程以确定占用了多少堆。我知道没有办法以编程方式做到这一点。
不要使用比核心更多的线程。创建新线程是一项相对昂贵的操作,创建过多线程实际上会导致应用程序运行更慢。如果您正在处理大量数据,或者需要非常低的延迟,那么您真的希望避免创建许多线程。
我建议调查ExecutorService。创建一个固定的线程池,该线程池等于您的模拟机器上的内核数。
编辑:
从 Java 1.4 开始,我们已经有了这个:
int cores = Runtime.getRuntime().availableProcessors();
试试这个,用线程创建一个固定的线程池cores
。这将允许您的应用程序在内核不同的机器之间进行扩展。
请注意,这是逻辑内核的数量,因此使用英特尔的超线程功能,它会为每个处理器计算 2 个“内核”。不过,一个很好的衡量标准。
这不是一个“容易”的任务,但有一些方法可以做到。jvm 通过管理 api 公开当前的内存使用情况。您可以使用 MemoryMXBean 和 MemoryPoolMXBean 来访问当前 jvm 内存状态。
您可以在VisualVM中监视程序时使用单个线程运行程序,然后使用两个线程,然后使用三个线程。内存使用和垃圾回收频率的差异可以让您了解单个线程使用了多少堆内存以及不同线程之间共享的对象占用了多少内存。