Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分配速度是否取决于正在使用的垃圾收集器?_Java_Performance_Garbage Collection_Memory Management - Fatal编程技术网

Java 分配速度是否取决于正在使用的垃圾收集器?

Java 分配速度是否取决于正在使用的垃圾收集器?,java,performance,garbage-collection,memory-management,Java,Performance,Garbage Collection,Memory Management,我的应用程序分配了大量的对象(>1mln/秒;大多数对象是大小约为80-100的字节数组和大小相同的字符串),我认为这可能是其性能不佳的原因 该应用程序的工作集只有几十兆字节。对该应用程序进行分析表明,GC时间小到可以忽略不计 然而,我怀疑分配过程可能取决于使用哪个GC,一些设置可能会使分配更快,或者可能会对缓存命中率产生积极影响,等等 是这样吗?或者,在垃圾收集本身花费很少时间的假设下,分配性能独立于GC设置吗?当然,您的性能取决于所使用的分配器。但是您已经分析了GC,并发现它不是什么大问题。

我的应用程序分配了大量的对象(>1mln/秒;大多数对象是大小约为80-100的字节数组和大小相同的字符串),我认为这可能是其性能不佳的原因

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

然而,我怀疑分配过程可能取决于使用哪个GC,一些设置可能会使分配更快,或者可能会对缓存命中率产生积极影响,等等


是这样吗?或者,在垃圾收集本身花费很少时间的假设下,分配性能独立于GC设置吗?

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

我认为您遇到了导致碎片的问题,这使得cpu的内存访问模式有问题,因为它可能需要太频繁地使其缓存失效。大多数GC算法没有以最佳方式回收空间

由于您的工作集是有限的和可预测的,您可能希望使用预先分配的对象池。您可能还希望使用引用计数来避免许多手动内存管理。从技术上讲,它仍然是GC,但不是GC的常识


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

对象分配有两个不同的方面。首先是找到一个合适的内存区域——对于当今的Garbarg收集器,这通常是非常快的(大约是机器周期的10分之几)


第二个是您分配的对象的初始化。由于在Java中分配的所有内容都已初始化,因此初始化的成本很容易超过分配的成本(除了最简单、最小的对象)。还有更多。由于初始化需要写入新对象占用的整个内存区域(如果分配一个“新字节”[1您的虚拟机是否尝试池化字符串?我听说过一次,IBM的虚拟机做了类似字符串插入但动态的事情(不知道这是真的)也许您的VM正在尝试做额外的工作来构建字符串内部的内部数据结构


您是否正在执行类似于
字节b[]=新字节[100];字符串s=新字符串(b);
的操作?您可能会尝试不分配字符串对象,而是分配一些引用字节[]的随机对象(用于比较)。

++用于“池”"概念。另一方面,引用计数?如果你在引用计数的任何地方有任何错误,它们都很难找到。迈克:在这种情况下实现引用计数并不难。池对象本身不包含引用。我也没有看到java标记。不幸的是,我的探查器给了我一个彻头彻尾的垃圾回答,我已经就此提出了一个问题。我知道一些关于评测的知识,但在这种情况下,我失败了,我将尝试像VTune这样的重炮…@jkff:我的答案是——评测器就是这样。这里有一些真正的重炮:您分配的对象是长寿命的,还是超出了范围它们是如何创建的?它们的寿命相当短:大约每10-20次分配,它们就会超出范围。是的,我正在做一些与您展示的代码类似的事情。但是我需要字符串,原因有很多。