`
hellsing42
  • 浏览: 258186 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

区别在于内存分配的方式,allocate分配的内存在jvm管理范围内,directAllocate分配的内存则不是由jvm管理,可以理解成是类似 C++那种分配

阅读更多

区别在于内存分配的方式,allocate分配的内存在jvm管理范围内,directAllocate分配的内存则不是由jvm管理,可以理解成是类似 C++那种分配的内存,大家一定会说那由directAllocate分配的内存即然不由jvm管理,那么他是如何释放的,虽然 directAllocate分配的内存不由jvm管理但他所属的对像还是由jvm管理的(比如ByteBuffer这类型的对像),所以当对像消亡时就 是这段内存释放的时候,至于为什么java要提供二种内存分配方式,由于java的内存不是直接由操作系统管理,所以当网络来了数据后,要到java里, 首先是放到系统所能操作的内存然后再复制到java的内存中,如果这部分内存是由directAllocate分配的,就不用再复制一次了,这样就减少了 内存复制的次数,当然directAllocate并不是万能的,要知道,在jvm之外分配内存本身是非常耗时的操作,所以并不是一定由 directAllocate分配的内存就能提高性能,这要看具体的操作了,对于小数据量的传送就建议不要用directAllocate分配了,大家可 以用allocate和directAllocate分配内存后通过调试看一下ByteBuffer对像的属性,可以清楚的看到由allocate分配的 内存是由byte[]类型定义的,而由directAllocate分配的只提供了一个long型的数据,这个long型的数据就是一个C++指针的转换 值,他指向的是这段内存的首地址。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics