当前位置: 首页 > 知识库问答 >
问题:

多处理器机器上的Java堆和GC?

马沛
2023-03-14

Java如何处理多处理器机器上的GC和堆分配?

在我所做的阅读中,单处理器和多处理器系统之间使用的算法似乎没有任何区别。艺术

作为一个数据点。Net时,算法发生了显著的变化:每个处理器都有一个与之密切相关的堆,每个处理器都负责该堆。这在很多地方都有记录,比如MSDN:

在运行服务器版本的执行引擎(MSCorSvr.dll)的多处理器系统上,托管堆被分成几个部分,每个CPU一个。当收集启动时,收集器每个CPU有一个线程;所有线程同时收集自己的部分。工作站版本的执行引擎(MSCorWks.dll)不支持此功能。

我还对专门针对多处理器系统的Java GC调优有兴趣。

共有2个答案

斜宁
2023-03-14

垃圾收集是一个实现特定的概念。不同的JVM(IBM、Oracle、OpenJDK等)有不同的实现,不同的机制也有不同的版本。通常,您可以在启动Java程序时选择要使用的机制。

这里有类似的问题。。。。

这些细节通常会在JRE命令行选项的留档中给出:

IBMJDK

Oracle JRE选项

舒斯伯
2023-03-14

实际上,在Hotspot JVM中,堆的使用方式并不取决于堆大小或核心数。

每个线程(不是处理器)都有一个线程本地分配缓冲区(TLAB),因此对象分配既便宜又线程安全。这个内存空间与您提到的堆处理器相似。

您还可以激活非统一内存访问(NUMA)。NUMA背后的想法是更喜欢靠近CPU芯片的RAM来存储对象,而不是将整个堆视为一个统一的空间。

最后,GC是多线程的,并根据内核数量进行缩放,因此它们会利用您的硬件。

 类似资料:
  • 问题内容: 假设您正在使用一个对象,并且正在使用构造函数的设置来传递一个初始化函数,然后该初始化函数将在全局命名空间中创建资源。假设资源具有上下文管理器。如果上下文管理的资源必须在流程的整个生命周期中都可以使用,但是在最后要进行适当的清理,您将如何处理它的生命周期呢? 到目前为止,我有点像这样: 从这里开始,池进程可以使用资源。到现在为止还挺好。但是,由于类不提供or或参数,因此处理清理工作有些棘

  • 问题内容: 我对多处理器机器中posix线程的并发性有一些疑问。我在SO中发现了类似的问题,但没有找到最终的答案。 以下是我的理解。我想知道我是否正确。 Posix线程是用户级线程,内核不知道。 内核调度程序会将Process(及其所有线程)视为一个用于调度的实体。依次是线程库选择要运行的线程。它可以在可运行线程之间划分内核给定的cpu时间。 用户线程可以在不同的cpu内核上运行。即让线程T1和T

  • 问题内容: 我不知道为什么,但是每当我尝试传递到共享对象共享自定义类对象的方法时,都会收到此奇怪的错误。python版本:3.6.3 码: 错误: 这是什么问题 问题答案: 在这里找到了临时解决方案。我已经设法通过在 multiprocessing \ managers.py中 的AutoProxy的初始化程序中添加必要的关键字来解决此问题,但是我不知道此kwarg是否负责任何事情。

  • 我必须使用Spring Batch配置一个作业。是否可以有一个单线程的项目阅读器,但多线程处理器? 在这种情况下,ItemReader将通过从数据库中读取工作项(通过执行预定义的查询)来创建要处理的工作项,每个处理器将并行处理项/块。

  • 问题内容: 我有一个Json文件,其中有一个字段需要编辑和保存以供下次使用。 但是我需要编辑的字段如下所示, 我需要分配该字段的值是在运行时随机生成的,我将在一个变量中捕获该变量并将其传递给此json特定键“ dp”,然后保存json。 保存的json将用于REST POST网址。 问题答案: 最简单的解决方案是编写一个可以为您更改值的python关键字。但是,您可以通过执行以下步骤来使用机器人关

  • 问题内容: 如果在多处理器或多处理器计算机上运行,​​而jvm可能绝对同时运行多个线程(不只是同时出现),那么api方法返回什么?…在​​上述情况下,它是否会返回当前线程之一是随机的吗? 问题答案: 它返回您当前正在其中运行的线程。如果你有两个核心和两个线程和完全并行运行,要求在同一时间这个方法,它将返回和适当的。 您的理解是正确的-此方法返回的线程始终处于运行状态-因为必须从某个线程调用该线程,