使用Java编程时,考虑到终写成程序的执行效率,可能在选择直接使用Java堆new对象,或是直接分配本地内存之间很难做出决定。粤嵌武汉Java培训来对比下Java堆与本地内存。
使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放。当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配。堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内存回收。但是在JVM中有一个‘后门’可以让你访问不在堆中的本地内存(native memory)。
使用Unsafe来分配和回收内存
sun.misc.Unsafe可以让你在Java中分配和回收本地内存,就像C语言中的malloc和free。通过它分配的内存不在Java堆中,并且不受垃圾回收器的管理,因此在它被使用完的时候你需要自己来负责释放和回收。
跨越JVM的屏障来读本地内存大约会比直接读Java堆中的内存慢10倍,而对于写操作会慢大约2倍。但是需要注意的是,由于每一个SomeMemoryObject对象所管理的本地内存空间都是独立的,因此读写操作都不是连续的。那么粤嵌武汉Java培训接下来就来对比下读写连续的内存空间的性能。
访问一大块的连续内存空间
在做连续访问的时候,Java堆内存通常都比本地内存要快。对于随机地址访问,堆内存仅仅比本地内存慢一点点,并且是针对大块连续数据的时候,而且没有慢很多。
的结论
在Java中使用本地内存有它的意义,比如当你要操作大块的数据时(>2G)并且不想使用垃圾回收器(GC)的时候。从延迟的角度来说,直接访问本地内存不会比访问Java堆快。这个结论其实是有道理的,因为跨越JVM屏障肯定是有开销的。这样的结论对使用本地还是堆的ByteBuffer同样适用。使用本地ByteBuffer的速度提升不在于访问这些内存,而是它可以直接与操作系统提供的本地IO进行操作。
粤嵌武汉Java培训认为,事实上使用Java写的程序,经过编译器编译打乱后很可能已经不是自己所想象的样子了,毕竟Java是面向对象的语言,所以更多的时候还不如怎么写得快就怎么写,毕竟编译器在很多时候都不太聪明,我们自以为写的很直接的程序也有可能编译成乱糟糟的复杂的机器语言。