java中为什么样要用ByteBuffer代替byte操作字节数据?jvm的堆栈问题

时间:2018-01-25 04:18:01   浏览:次   点击:次   作者:   来源:   立即下载

是说用ByteBuffer代替byte[](元素类型为byte的数组)么?

其实也算不上是代替吧,只是希望能给native memory里的数据跟Java堆里的数据能套上①个统①的接口而已:

Java堆里的:HeapByteBuffer - 由byte[]存储实际数据Java堆外的(native memory里的):DirectByteBuffer - 由 malloc() / mmap() 等申请出来的空间存储实际数据仅此而已。所以如果针对byte[]来编程,就只能操作Java堆内的数据;而如果针对ByteBuffer接口来编程,就自然地可以操作Java堆内与堆外的数据,而不必关心具体底下的数据存哪里。

① · 栈是和线程对应,也就是JVM为每个线程都维护了①个栈。栈存放的是对象的引用和本地方法的基础数据类型变量,栈的大小是编译器就已知的。

② · 堆是JVM内部线程共享的,所以在多线程使用场景下,需要做同步操作。

③ · 最后你说的应该是内存可见性,这个指的是cache和主存数据之间的关系。

楼主在基础知识学好后可以去读《深入理解 Java 虚拟机》这本书,里面对JVM的讲解很到位。同时建议读相关官方文档来促进了解。

既然是栈(Stack),就不会存放对象或者对象副本了,因为Stack的每个Item的大小事固定的。而且,垃圾收集不会关注Stack,只是关注Heap,所以对象都跑到Heap中了。Java中的Stack有好些个呢,要注意区分,比如Stack(虚拟机栈、线程栈)、操作栈、本地方法栈等。可阅读JVM规范。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息