JVM直接内存

概述

直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通脱一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

  • 本机直接内存的分配不会受到Java 堆大小的限制,受到本机总内存大小限制

  • 配置虚拟机参数时,不要忽略直接内存 防止出现OutOfMemoryError异常

直接内存(堆外内存)与堆内存比较

  1. 直接内存申请空间耗费更高的性能,当频繁申请到一定量时尤为明显
  2. 直接内存IO读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显

代码验证:

package com.xnccs.cn.share;import java.nio.ByteBuffer;/*** 直接内存 与  堆内存的比较*/
public class ByteBufferCompare {public static void main(String[] args) {allocateCompare();   //分配比较operateCompare();    //读写比较}/*** 直接内存 和 堆内存的 分配空间比较* * 结论: 在数据量提升时,直接内存相比非直接内的申请,有很严重的性能问题* */public static void allocateCompare(){int time = 10000000;    //操作次数                           long st = System.currentTimeMillis();for (int i = 0; i < time; i++) {//ByteBuffer.allocate(int capacity)   分配一个新的字节缓冲区。ByteBuffer buffer = ByteBuffer.allocate(2);      //非直接内存分配申请     }long et = System.currentTimeMillis();System.out.println("在进行"+time+"次分配操作时,堆内存 分配耗时:" + (et-st) +"ms" );long st_heap = System.currentTimeMillis();for (int i = 0; i < time; i++) {//ByteBuffer.allocateDirect(int capacity) 分配新的直接字节缓冲区。ByteBuffer buffer = ByteBuffer.allocateDirect(2); //直接内存分配申请}long et_direct = System.currentTimeMillis();System.out.println("在进行"+time+"次分配操作时,直接内存 分配耗时:" + (et_direct-st_heap) +"ms" );}/*** 直接内存 和 堆内存的 读写性能比较* * 结论:直接内存在直接的IO 操作上,在频繁的读写时 会有显著的性能提升* */public static void operateCompare(){int time = 1000000000;ByteBuffer buffer = ByteBuffer.allocate(2*time);  long st = System.currentTimeMillis();for (int i = 0; i < time; i++) {//  putChar(char value) 用来写入 char 值的相对 put 方法buffer.putChar('a');}buffer.flip();for (int i = 0; i < time; i++) {buffer.getChar();}long et = System.currentTimeMillis();System.out.println("在进行"+time+"次读写操作时,非直接内存读写耗时:" + (et-st) +"ms");ByteBuffer buffer_d = ByteBuffer.allocateDirect(2*time);long st_direct = System.currentTimeMillis();for (int i = 0; i < time; i++) {//  putChar(char value) 用来写入 char 值的相对 put 方法buffer_d.putChar('a');}buffer_d.flip();for (int i = 0; i < time; i++) {buffer_d.getChar();}long et_direct = System.currentTimeMillis();System.out.println("在进行"+time+"次读写操作时,直接内存读写耗时:" + (et_direct - st_direct) +"ms");}
}

输出: 
在进行10000000次分配操作时,堆内存 分配耗时:12ms 
在进行10000000次分配操作时,直接内存 分配耗时:8233ms 
在进行1000000000次读写操作时,非直接内存读写耗时:4055ms 
在进行1000000000次读写操作时,直接内存读写耗时:745ms

可以自己设置不同的time 值进行比较

分析

从数据流的角度,来看

非直接内存作用链: 
本地IO –>直接内存–>非直接内存–>直接内存–>本地IO 
直接内存作用链: 
本地IO–>直接内存–>本地IO

直接内存使用场景

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

参考

《深入理解Java虚拟机》 –周志明

博文:https://www.cnblogs.com/xing901022/p/5243657.html

转发:https://blog.csdn.net/leaf_0303/article/details/78961936

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

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

相关文章

英语----专业单词

directive (滴 ‘ruai k tive) n&#xff1a;指令determine 【di tε:min】 (de ter min) v&#xff1a;确定 词根&#xff1a;term 边界 distributions (dis tree biu tion)v&#xff1a;分配 C&#xff1a;发行版 exact (衣 ge za k t) adj&#xff1a;确切的 ex&#xff1a…

js遍历table

js遍历table var tableObj document.getElementById("tableName");var str "";for(var i0;i<tableObj.rows.length;i){for(varj0;j<tableObj.rows[i].cells.length;j){//str tableObj.rows[i].cells[j].innerHTML" ";for(var z0;z<…

深入理解JVM—JVM内存模型

我们知道&#xff0c;计算机CPU和内存的交互是最频繁的&#xff0c;内存是我们的高速缓存区&#xff0c;用户磁盘和CPU的交互&#xff0c;而CPU运转速度越来越快&#xff0c;磁盘远远跟不上CPU的读写速度&#xff0c;才设计了内存&#xff0c;用户缓冲用户IO等待导致CPU的等待成…

Nginx----进阶

用Nginx搭建一个静态的web资源服务器/动静分离 简单使用 1、可以在安装的nginx目录新建自己的目录zy&#xff08;和conf在一个目录下&#xff0c;也就是和html目录在一个目录下&#xff0c;注意如果使用/zy&#xff0c;那么zy目录需要创建在linux根目录&#xff09;&#xff0c…

ASP.NET页面生命周期描述

ASP.NET页面生命周期描述2008-09-12 09:25在以前写个一篇关于ASP.NET页面生命周期的草稿,最近又看了看ASP.NET&#xff0c;做个补充,看看页面初始过程到底是怎么样的 下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load();…

小程序·云开发的HTTP API调用丨实战

小程序云开发之httpApi调用。 小程序云开发之httpApi调用&#xff08;返回“47001处理”&#xff09; 技术栈 采用 nodejs express 搭建web服务器&#xff0c;采用 axios 请求第三方 httpApi nodejsexpressaxios 项目结构 通过应用生成器工具 express-generator 可以快速创建一…

Java hashCode() 和 equals()使用的场景

第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码&#xff0c;也称为散列码&#xff1b;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中&#xff0c;这就意味着Java中的任何类都包含有hashCo…

坚守基本的职业信仰

深陷公司的政治斗争会让任何当事人都疲于奔命&#xff0c;尤其是当这种斗争的双方都是您的上级。除非您一开始就能够知道最终的斗争结果&#xff0c;否则任何具有倾向性的言行都会给自己带来难堪。 深陷入别人的职业斗争是一个职业经理人职业生涯最大的不幸&#xff0c;除非…

Zookeeper----基本原理

Zookeeper作用是什么&#xff1f; 协调分布式系统中的多个服务器&#xff0c;使得系统可以正常工作。 Zookeeper提供了什么&#xff1f; 实际上他只提供了三个东西&#xff0c;一个是文件系统&#xff0c;一个是通知机制&#xff0c;还有一个是集群管理机制 Zookeeper可以做什么…

Java 中 Comparable 和 Comparator 比较

Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口&#xff0c;就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序&#xff0c;假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”&#xff0c;则该List列表(或数组)可以通…

spgridview的过滤功能回调时发生错误~

代码中启用了过滤功能&#xff0c; 但当点击过滤的列时发生错误&#xff1a; error: spgridview_filtercallbackerrorhandler() was called - result 回调时发生错误... 详细见&#xff1a; HTML代码&#xff1a; AllowFiltering"True"FilterDataFields",Name,,…

web---SSL/TSL

对称加密 加密算法秘钥&#xff08;双方持有相同的秘钥&#xff09;&#xff0c;A使用加密算法秘钥加密文件&#xff0c;B使用加密算法秘钥解密文件&#xff1b; 演示一个对称加密RC4算法 注意&#xff1a;RC4加密是有漏洞的 明文和秘钥进行异或得到密文&#xff0c;密文和秘钥…

讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题

通过百度和谷歌找了好久都没找着一个合适的方法。以下是自己找出的一种方法&#xff0c;自认为还可以&#xff0c;而且&#xff0c;也方便简单。IE:当容器为div,或者tr,只要把容器的Css属性line-height设置成容器的高度就行了.当容器为a,且容器的css属性display为inline-block或…

Nginx----实现https站点

1、首先给域名设置证书&#xff0c;可以去阿里云购买 1、下载自动化脚本 目的&#xff1a;帮我们自动在nginx配置中添加证书 yum install python2-certbot-nginx2、输入命令 certbot --nginx --nginx-server-root/usr/local/openresty/nginx/conf/ -d zy.com 选择我们的url请求…

TCP/IP四层模型和OSI七层模型的概念

TCP/IP四层模型 TCP/IP是一组协议的代名词&#xff0c;它还包括许多协议&#xff0c;组成了TCP/IP协议簇。TCP/IP协议簇分为四层&#xff0c;IP位于协议簇的第二层(对应OSI的第三层)&#xff0c;TCP位于协议簇的第三层(对应OSI的第四层)。 TCP/IP通讯协议采用了4层的层级结构&…

setsockopt()用法(转载)

1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分&#xff09;调用 closesocket&#xff08;一般不会立即关闭而经历TIME_WAIT的过程&#xff09;后想继续重用该socket&#xff1a; BOOL bReuseaddrTRUE; setsockopt(s,SOL_SOCKET ,…

Nginx----OpenResty

概要 OpenResty是一个基于Nginx与Lua的高性能Web平台&#xff0c;其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。OpenRestye通过汇聚各种设计精良的Nginx模块&#xff08;主要由O…

《深入浅出Google Android》即将隆重上市!

《深入浅出 Google Android 》 作者在线答疑活动开始啦 &#xff1a;http://www.hiapk.com/bbs/forum-41-1.html 随着越来越多的手机 厂商和移动运营商加入了开放手机联盟&#xff0c; Android 平台 越来越受到广大开发 者的关注和推崇。 本书是是国内最早的 And…

MySQL两种引擎

Innodb引擎概述 Innodb引擎提供了对数据库ACID事务的支持&#xff0c;并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束&#xff0c;它的设计目标是处理大容量数据库系统&#xff0c;它本身其实就是基于MySQL后台的完整数据库系统&#xff0c;MySQL运行时Inno…

公钥基础设施PKI体系介绍

PKI(Pubic Key Infrastructure)是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。用户可利用PKI平台提供的服务进行安全通信。 使用基于公钥技术系统的用户建立安全通信信任机制的基础是&#xff1a;网上进行的任何需要安全服务的通信都是建…