哪个更快:Java堆还是本地内存
2016-10-31 09:43
260 查看
使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放。当你用
memory)。在这篇文章中,我会给你演示一个对象是怎样以连续的字节码的方式在内存中进行存储,并且告诉你是应该怎样存储这些字节,是在Java堆中还是在本地内存中。最后我会就怎样从JVM中访问内存更快给一些结论:是用Java堆还是本地内存。
让我们来将下面的Java对象放到本地内存中:
我们所做的仅仅是把对象的属性放入到
现在我们来看看对两个数组的读写性能:其中一个含有数百万的
结论:跨越JVM的屏障来读本地内存大约会比直接读Java堆中的内存慢10倍,而对于写操作会慢大约2倍。但是需要注意的是,由于每一个SomeMemoryObject对象所管理的本地内存空间都是独立的,因此读写操作都不是连续的。那么我们接下来就来对比下读写连续的内存空间的性能。
这个测试分别在堆中和一大块连续本地内存中包含了相同的测试数据。然后我们来做多次的读写操作看看哪个更快。并且我们会做一些随机地址的访问来对比结果。
结论:在做连续访问的时候,Java堆内存通常都比本地内存要快。对于随机地址访问,堆内存仅仅比本地内存慢一点点,并且是针对大块连续数据的时候,而且没有慢很多。
在Java中使用本地内存有它的意义,比如当你要操作大块的数据时(>2G)并且不想使用垃圾回收器(GC)的时候。从延迟的角度来说,直接访问本地内存不会比访问Java堆快。这个结论其实是有道理的,因为跨越JVM屏障肯定是有开销的。这样的结论对使用本地还是堆的
new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配。堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内存回收。但是在JVM中有一个‘后门’可以让你访问不在堆中的本地内存(native
memory)。在这篇文章中,我会给你演示一个对象是怎样以连续的字节码的方式在内存中进行存储,并且告诉你是应该怎样存储这些字节,是在Java堆中还是在本地内存中。最后我会就怎样从JVM中访问内存更快给一些结论:是用Java堆还是本地内存。
使用Unsafe
来分配和回收内存
sun.misc.Unsafe可以让你在Java中分配和回收本地内存,就像C语言中的
malloc和
free。通过它分配的内存不在Java堆中,并且不受垃圾回收器的管理,因此在它被使用完的时候你需要自己来负责释放和回收。下面是我写的一个使用
Unsafe来管理本地内存的一个工具类:
在本地内存中分配一个对象
让我们来将下面的Java对象放到本地内存中:Memory中:
SomeObject对象,另外一个含有数百万的
SomeMemoryObject对象。
访问一大块的连续内存空间
这个测试分别在堆中和一大块连续本地内存中包含了相同的测试数据。然后我们来做多次的读写操作看看哪个更快。并且我们会做一些随机地址的访问来对比结果。
最后的结论
在Java中使用本地内存有它的意义,比如当你要操作大块的数据时(>2G)并且不想使用垃圾回收器(GC)的时候。从延迟的角度来说,直接访问本地内存不会比访问Java堆快。这个结论其实是有道理的,因为跨越JVM屏障肯定是有开销的。这样的结论对使用本地还是堆的ByteBuffer同样适用。使用本地ByteBuffer的速度提升不在于访问这些内存,而是它可以直接与操作系统提供的本地IO进行操作。
相关文章推荐
- 哪个更快:Java堆还是本地内存
- 哪个更快:Java堆还是本地内存
- 哪个更快:Java堆还是本地内存
- 哪个更快:Java堆还是本地内存
- 院长告诉你Java堆和本地内存到底哪个更快!
- JVM 内存基础概念之程序计数器与 Java 虚拟机栈和本地方法栈
- java获取本地cpu、内存、硬盘信息
- java里的静态成员变量是放在了堆内存还是栈内存
- 本地启动tomcat的时候报内存溢出错误:java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
- C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError
- 内存溢出,无法创建新的本地线程的原因和解决方案 - java.lang.OutOfMemoryError: unable to create new native thread
- 【自动内存管理机制】(1)Java内存区域(方法区、虚拟机栈、本地方法栈、堆、程序计数器)与内存溢出异常
- java里的静态变量是放在了堆内存还是栈内存?
- java里的静态成员变量是放在了堆内存还是栈内存
- java里的静态成员变量是放在了堆内存还是栈内存
- JAVA专业好还是C语言专业好,哪个编程语言好就业?
- 遇到 java.lang.OutOfMemoryError: PermGen space配多少合适我的内存为4G在哪配置Jboss的run.bat还是。。
- java里的静态成员变量是放在了堆内存还是栈内存
- 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)
- java内存区域-本地方法栈