内存heap_哪个内存更快?Heap或ByteBuffer或Direct?

内存heap

Java正在成为新的C / C ++,它被广泛用于开发高性能系统。 对像我这样的数百万Java开发人员来说非常好!
在这个博客中,我将分享我可以用Java完成的不同类型的内存分配的实验,以及从中获得什么好处。

Java中的内存分配

Java为内存分配提供哪种类型的支持:

–堆内存

我不必解释这一点,所有Java应用程序都以此开头。 使用“ new”关键字分配的所有对象都在“堆内存”下

–非直接字节缓冲区

它是字节数组的包装,只是堆内存的味道。
ByteBuffer.allocate()可用于创建这种类型的对象,如果要处理字节而不是对象,则非常有用。

–直接字节缓冲区

这是Java自JDK 1.4起添加的真实内容。
基于Java Doc的Direct ByteBuffer的描述

“可以通过调用此类的allocateDirect工厂方法来创建直接字节缓冲区。 这种方法返回的缓冲区通常比非直接缓冲区具有更高的分配和释放成本。 直接缓冲区的内容可能驻留在普通垃圾回收堆的外部,因此它们对应用程序内存占用的影响可能并不明显。 因此,建议直接缓冲区主要分配给大型,寿命长的缓冲区,这些缓冲区要受基础系统的本机I / O操作的约束。 通常,最好仅在直接缓冲区产生可观的程序性能提升时才分配它们。”

关于直接缓冲区要注意的重要事项是

  • 它在JVM之外
  • 远离垃圾收集器。

如果您关心性能,这些都是非常重要的事情。
MemoryMapped文件也具有Direct字节缓冲区的风格,我在以下博客中与我分享了一些发现:

  • arraylist使用内存映射文件
  • Java记忆符号文件的功能

堆或直接内存

这几乎与Direct ByteBuffer相同,但是几乎没有什么不同,它可以由unsafe.allocateMemory分配,因为它是直接内存,因此不会产生GC开销。 这种类型的内存必须手动释放。

从理论上讲,不允许Java程序员进行这种分配,我认为原因可能是

  • 操作这种类型的内存很复杂,因为您只处理字节而不是对象
  • C / C ++社区不会喜欢它

让我们深入研究内存分配

对于内存分配测试,我将使用13字节的消息,并将其分解为

  • int – 4字节
  • 长– 8字节
  • 字节– 1字节

我只会测试写入/读取性能,而不会测试内存消耗/分配速度。

写性能

分配-写TP

X轴 –没有读数

Y轴 -运算/秒(百万)

使用4种分配类型写入500万个13字节对象。

  1. 在这种情况下,最好使用Direct ByteBuffer和Off Heap,吞吐量接近
  2. 3.5亿/秒
  3. 普通的ByteBuffer非常慢,TP仅为8500万/秒
  4. Direct / Off堆比堆快1.5倍

我对5000万个对象进行了相同的测试,以检查其缩放比例,以下是相同的图形。
分配-写TP 50
X轴 –没有读数 Y轴 -运算/秒(百万) 数字几乎等于500万。

阅读表现

让我们看一下阅读性能
分配-阅读TP 5
X轴 –没有读数 Y轴 -运算/秒(百万) 这个数字很有趣,OFF堆正在为12,000 Mills / Sec快速吞吐。 HEAP读取仅接近一次,比OFF Heap慢6倍左右。 看一下Direct ByteBuffer,它的传输速度仅为4亿/秒,不知道为什么会这样。

让我们看看5000万个对象的数量
分配-阅读TP 50
X轴 –没有读数 Y轴 -运算/秒(百万) 没有太大的不同。

结论

通过Unsafe进行的堆外业务以330/11200百万/秒的速度快速燃烧
所有其他类型的分配的性能对读取或写入均有利,而所有分配均不适用于两者。
关于ByteBuffer的特别说明,可悲的是,我确定看到这样的数字后您将不会使用它。 DirectBytebuffer的读取速度很慢,我不确定为什么它这么慢。

因此,如果内存读/写正在成为您系统中的瓶颈,那么肯定要走“堆外”方式,请记住这是高速公路,因此请谨慎驾驶。

代码可用@ git hub

参考: 哪个内存更快Heap或ByteBuffer或Direct? 来自我们JCG合作伙伴 Ashkrit Sharma的“您准备好了吗”博客。

翻译自: https://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html

内存heap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE 8的前5个新功能

备受期待的Java Enterprise Edition 8版本拥有两个激动人心的新API(JSON绑定1.0和Java EE Security 1.0)以及对当前API的改进(JAX-RS 2.1,Bean Validation 2.0,JSF 2.3,CDI 2.0,JSON-P&#xff…

C语言实用算法系列之二级指针用法简介

一、几个知识点 内存四区:栈、全局(静态),常量区,除此以外剩余的空间暂时不能随意使用;除此以外剩余的空间只要通过malloc函数申请一下,就可以使用了;申请一个堆上的单个int变量的方…

C语言实用算法系列之行指针

代码 #include <stdio.h>void Test(double (*a)[3]) {printf("sizeof(a)%d\n", sizeof(a));printf("sizeof(*a)%d\n", sizeof(*a));printf("sizeof(a[1])%d\n", sizeof(a[1])); }void main() {double ar[2][3] { {1.0,2.1,3.2},{4.3,5.4…

C语言实用算法系列之DOS传参“加减乘除计算器”

简介 主要采用str族函数实现字符检测&#xff0c;只能用DOS传参进行计算&#xff0c;详见运行结果。 代码 #include <stdio.h> #include <string.h> #include <stdlib.h>/* int main(int argc, char** argv) { int i0; printf("总共有%d条有效字符串…

ARP地址解析协议(深信服X计划)

文章目录一、ARP需求背景二、ARP概述及工作原理三、免费ARP概述及案例四、代理ARP概述及案例一、ARP需求背景 在以太网中&#xff0c;一个主机和另一个主机进行直接通信&#xff0c;必须要知道目标主机的MAC地址。单这个目标MAC地址是如何获得的呢&#xff1f;它就是通过ARP&a…

grails框架_Play和Grails Java框架的优缺点

grails框架框架通过为程序员提供一些有用的功能来简化应用程序开发过程。 由于开发人员的普遍使用&#xff0c;Java框架经常被开发人员使用。 您可以在市场上找到各种Java开发框架。 新手开发人员经常在论坛上发布一个常见问题&#xff1a;“哪种Java框架是最好的&#xff1f;”…

TCP和UDP协议(深信服X计划)

文章目录一、TCP协议概述二、TCP三次握手和四次挥手三、UDP协议概述四、TCP和UDP对比及应用场景一、TCP协议概述 TCP (Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由ETF的RFC 793定义。在简化的计算机网络O…

C语言实用算法系列之时间族函数、目录遍历

时间族函数测试 代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <stdlib.h> #include <time.h>void main() {time_t tt;//long __int64time(&tt);tm* time localtime(&tt);char* ws[] { "日","一","…

跟踪反应流–将Spring Cloud Sleuth与Boot 2结合使用

Spring Cloud Sleuth在OpenZipkin Brave的基础上增加了对Spring工具的支持&#xff0c; 从而使Spring Boot应用程序的分布式跟踪变得异常简单。 这是一篇关于如何使用此出色的库添加对分布式跟踪支持的简要说明。 考虑两个应用程序–一个使用上游服务应用程序的客户端应用程序…

DNS域名解析协议(深信服X计划)

文章目录一、DNS协议背景二、DNS协议概述三、DNS工作原理四、DNS常用的记录及作用一、DNS协议背景 在Internet网中连接着数量众多的主机&#xff0c;要让这些主机进行通信&#xff0c;需要有一套名字标识体系&#xff0c;让主机之间能够彼此找到对方&#xff0c;我们可以用多种…

基于51单片机的温度检测监测报警系统设计

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发生关键词&#xff1a;单片…

rest 验证demo_如何实现REST资源的输入验证

rest 验证demo如何实现REST资源的输入验证 我正在使用的SaaS平台具有一个RESTful接口&#xff0c;该接口可以接受XML有效负载。 实施REST资源 对于像我们这样的Java商店&#xff0c;使用JAX-B从XML Schema生成JavaBean类是有意义的。 在像Jersey的JAX-RS环境中&#xff0c;使…

校园点餐系统:点餐、食堂管理、商户管理和菜品管理(Java和MySQL)

微信公众号&#xff1a;创享日记 发送关键词&#xff1a;校园点餐系统 获取报告数据库设计说明项目源码源文件工程文件 1 实验环境 操作系统&#xff1a;Windows 10&#xff0c;主要开发工具&#xff1a;PowerDesign&#xff0c;MySQL&#xff0c;Eclipse 2 实验过程 2.1 系统…

病情预测:指示病情程度、预测病情指标(深度学习和Python)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;病情…

邮件系统(基于SMTP协议和POP3协议-C语言实现)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;邮件…

arp、ethernet、icmp、udp、ip协议的C语言实现(计算机网络协议栈实验)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;协议…

CPU设计(单周期和流水线)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;cpu …

前馈-反馈控制系统设计(过程控制课程设计matlab/simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;前馈…

感应电机直接转矩控制系统的设计与仿真(运动控制matlab/simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;直接…

双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;双容模糊 获…