我工作的公司对于JVM开发平台有一种非常不同的观点。
基于本文- http://people.cs.umass.edu/~emery/pubs/gcvsmalloc.pdf
他们说,oracle jvm需要3-5倍的内存开销,即运行1GB的JVM,我们需要3-5 GB的额外RAM来抵消JVM开销,而快捷风格ARC是GC问题的答案。
我提出了一些反驳,认为他们进行研究的不是Oracle/Sun,一些实验性的VM和ARC也有自己的问题,比如循环引用。
对于JVM中的内存GC的开销究竟是多少,我找不到任何研究。
我的问题总结
( 1) GC是否有可见的开销?因为如果事实属实的话,RAM的3-5倍的成本似乎真的不合理。
此外,像Apache、hbase、cassandra这样的大数据应用程序在in /petabyte内存范围内运行。如果GC中存在这样的开销,为什么要在这样的平台上进行开发呢?
2) ARC被认为比其他运行时GC跟踪算法要差。如果这是真的,如果有任何论文直接比较ARC编译时malloc/free vs JVM JVM运行时清除的效果,也会有帮助。
Chris Lattner声称GC在这里消耗3-5倍内存- https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160208/009422.html。
发布于 2016-11-05 20:00:07
GC是否有可见的开销。因为如果事实属实的话,RAM的3-5倍的成本似乎真的不合理。
这很可能是个误会。您可以在使用99%堆的情况下运行JVM,但是它将定期使用GC。如果您给应用程序更多的内存,它将能够更有效地工作。向堆中添加更多内存可以提高吞吐量。我已经看到了这项工作高达3倍。除了在极端情况下,您不太可能看到增加更多的好处。
此外,像Apache、hbase、cassandra这样的大数据应用程序在in /petabyte内存范围内运行。如果GC中存在这样的开销,为什么要在这样的平台上进行开发呢?
在处理大数据时,通常使用内存映射文件和堆外内存。这使应用程序管理的大部分数据不是GC。这与用C++编写的数据库的操作方式没有什么不同。
ARC被认为不如其他运行时GC跟踪算法。
我不能评论ARC有多聪明。Java没有对GC的操作方式施加任何限制,但是子文本是这样的;它至少必须处理循环引用。任何更少的事情都被认为是不可接受的。
顺便说一下,Java通过直接ByteBuffers使用malloc/free。
使用数据集(如1GB)的作业
什么使一个数据集1GB。在磁盘上压缩,可能是100 MB。作为原始的未压缩数据,它可能是1GB。在作为数据结构的内存中,它可能是2GB,如果使用另一个1或2GB来处理该数据结构,吞吐量可能会更快。
https://stackoverflow.com/questions/40441787
复制相似问题