繁体   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