博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java直接内存与非直接内存性能测试
阅读量:6814 次
发布时间:2019-06-26

本文共 2033 字,大约阅读时间需要 6 分钟。

什么是直接内存与非直接内存

根据官方文档的描述:

A byte buffer is either direct or non-direct. Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations.

byte byffer可以是两种类型,一种是基于直接内存(也就是非堆内存);另一种是非直接内存(也就是堆内存)。

对于直接内存来说,JVM将会在IO操作上具有更高的性能,因为它直接作用于本地系统的IO操作。而非直接内存,也就是堆内存中的数据,如果要作IO操作,会先复制到直接内存,再利用本地IO处理。

从数据流的角度,非直接内存是下面这样的作用链:

本地IO-->直接内存-->非直接内存-->直接内存-->本地IO

而直接内存是:

本地IO-->直接内存-->本地IO

很明显,再做IO处理时,比如网络发送大量数据时,直接内存会具有更高的效率。

A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.

但是,不要高兴的太早。文档中也说了,直接内存使用allocateDirect创建,但是它比申请普通的堆内存需要耗费更高的性能。不过,这部分的数据是在JVM之外的,因此它不会占用应用的内存。

所以呢,当你有很大的数据要缓存,并且它的生命周期又很长,那么就比较适合使用直接内存。只是一般来说,如果不是能带来很明显的性能提升,还是推荐直接使用堆内存。

关于直接内存需要注意的,就是上面两点了,其他的关于视图啊、作用链啊,都是使用上的问题了。如果有兴趣,可以,里面有少量的描述!重要的一些用法,还得自己摸索。

使用场景

通过上面的官方文档,与一些资料的搜索。可以总结下,直接内存的使用场景:

  • 1 有很大的数据需要存储,它的生命周期又很长
  • 2 适合频繁的IO操作,比如网络并发场景

申请分配地址速度比较

下面用一段简单的代码,测试下申请内存空间的速度:

int time = 10000000;Date begin = new Date();for(int i=0;i

得到的测试结果如下:

449064-20160304221951065-26353713.png

在数据量提升时,直接内存相比于非直接内存的申请 有十分十分十分明显的性能问题!

读写速度比较

然后在写段代码,测试下读写的速度:

int time = 1000;Date begin = new Date();ByteBuffer buffer = ByteBuffer.allocate(2*time);for(int i=0;i

测试的结果如下:

449064-20160304222002627-1498895689.png

可以看到直接内存在直接的IO操作上,还是有明显的差异的!

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
函数的调用过程(栈帧)
查看>>
MySQL主从复制与lvs+keepalived单点写入读负载均衡高可用实验【转】
查看>>
SOA面向服务化编程架构(dubbo)
查看>>
sphinx全文索引开源
查看>>
junit测试套件
查看>>
向一个网站发请求的几种方式
查看>>
UVA - 10245 The Closest Pair Problem
查看>>
利用Bootstrap制作一个流行的网页
查看>>
大型网站架构 图片服务器分离
查看>>
【设计模式】迭代器模式(Iterator )
查看>>
Linux ssh安全设置
查看>>
LVM逻辑卷管理
查看>>
ubuntu:重装之后软件安装流程
查看>>
python读写不同编码txt文件
查看>>
Linux 基本命令(持续更新ing)
查看>>
java基础必备单词讲解 day six
查看>>
第7章 SpringMVC高级技术
查看>>
C语言结构体里的成员数组和指针
查看>>
【转】AlphaGo Zero 和强人工智能
查看>>
二维凸包
查看>>