我在Java和C ++中运行了一些小测试,创建了大量非常小的对象(没有类成员,构造函数中没有任何内容),而Java显然更快(我的意思是C ++似乎非常慢)。我敢打赌,这与JVM有关,但是以哪种方式?
编辑:
我使用的类是这样的(因为我说没有类成员,在构造函数中没有做任何事情)在C ++中:
class foo{
public:
foo(){}
~foo(){}
}
在Java中:
public class Foo{
public Foo(){}
}
我做的小测试只是关于在一个循环中分配大量的对象(连续大约1000000000)。我在使用Linux的同一台机器上使用了GCC 4.7.2和Java 1.7到OpenJDK的实现。
我敢打赌,它确实与内存池分配有关,这表明JVM拥有不需要的内存。
我仍然感到困惑,因为我认为JVM实际上会更慢,计算指针引用和分配内存。
答案 0 :(得分:11)
在堆上分配许多小对象是Java的运行时通常比C ++(在大多数主流实现中)更好地优化的一种情况。每次使用new
在C ++中分配堆对象时,实现通常都会对OS进行系统调用(至少在Linux和Windows等大多数主流平台上)。在Java中,它通常从JVM提供的内存池进行分配,JVM是专门为在堆上分配Java对象而设计和优化的。
通常,C ++可以为您的程序分配和管理内存提供更细粒度的控制。而JVM受实际Java语言规范约束requires heap-allocated objects和垃圾收集。但是,如果您在C ++中编写需要在堆上分配许多小对象的应用程序,则可能需要考虑使用内存池分配器。