JVM 内存和 CPU 使用率的实际限制?

2022-09-04 22:27:46

假设金钱不是一个限制因素,我想写一个在一台功能强大的机器上运行的Java程序。

目标是使Java程序尽可能快地运行,而不必交换或转到磁盘

假设这台计算机具有:

  • 1 TB 内存 (64 个 16GB DIMM)
  • 64 个处理器内核(8 个 8 核处理器)
  • 运行 64 位 Ubuntu

在JVM中运行的Java程序的单个实例是否可以利用如此多的RAM和处理器?

是否有任何实际考虑因素可能会限制使用和效率?

  • 操作系统进程(内存和线程)限制?
  • JVM 内存/堆限制?
  • JVM 线程限制?

谢谢 盖伦


答案 1

单个实例可以尝试访问所有内存,但 NUMA 区域意味着 GC 等内容在另一个区域中访问内存时执行不正常。这越来越快,JVM有一些NUMA支持,但如果你想要可扩展性,它需要改进。即使这样,您也可以获得256 MB的堆并使用700的本机/直接内存而不会出现此问题。;)

如果您有大量内存,最大的限制是数组,集合和ByteBuffer(用于内存映射文件)都限制为20亿的大小。(2^31-1)

您可以使用自定义集合解决这些问题,但恕我直言,Java确实应该支持这些问题。

顺便说一句:您可以以4万英镑的价格购买带有1 TB内存和24个内核/ 48线程的戴尔R910。

顺便说一句:我只有最大40 GB的JVM的经验。


答案 2

首先,Java程序本身:设计不佳的代码不会使用那么多的计算机能力。例如,实现不当的线程可能会使您的性能变慢。

操作系统也是一个限制因素:并非所有操作系统都能很好地处理这种内存量。

我认为JVM可以处理这种内存量,因为操作系统支持它。