java - 分配速度是否取决于所使用的垃圾收集器?

标签 java performance garbage-collection memory-management

我的应用程序正在分配大量对象(每秒 >100 万个;大多数对象是大小约为 80-100 的字节数组和相同大小的字符串),我认为这可能是其性能不佳的根源。

该应用程序的工作集只有几十兆字节。对应用程序进行分析表明 GC 时间非常短,可以忽略不计。

但是,我怀疑分配过程可能取决于所使用的GC,并且某些设置可能会使分配更快或者可能对缓存命中率产生积极影响等。

是这样吗?或者假设垃圾回收本身只需要很少的时间,分配性能是否独立于 GC 设置?

最佳答案

当然,您的性能取决于所使用的分配器。但您已经分析过 GC 并发现这不是什么大问题。此外,GC 的优势之一是以较慢的收集速度为代价实现快速分配。

我认为您遇到了由此产生的碎片问题,这使得 CPU 的内存访问模式出现问题,因为它可能需要过于频繁地使其缓存失效。大多数 GC 算法不能以最佳方式回收空间。

由于您的工作集是有限且可预测的,因此您可能需要使用预先分配的对象池。您可能还想使用引用计数来避免大量手动内存管理。从技术上讲,它仍然是GC,但不是普通意义上的GC。

不过,我认为性能并不会受到内存管理方式的影响,而是实际使用和访问内存的方式的影响。您的分析器很可能有明确的答案。

关于java - 分配速度是否取决于所使用的垃圾收集器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2951539/

相关文章:

java - 如何在 Java 中处理多个流?

java - 为什么 jcombobox 不可见?

java.sql.SQLException : ORA-01017: invalid username/password; logon denied 异常

Python heapq 模块,对象上的 heapify 方法

java - finalizable 对象如何至少需要 2 个垃圾收集周期才能被回收?

c# - 强制执行所需的函数调用

java - 自动将循环重构为递归方法?

performance - 使用陈旧数据从随机间隔数据集构建固定间隔数据集

mysql - MySQL 中的 UNION ALL 性能不佳

Ruby WeakRef 具有隐式竞争条件?