【JVM基础06】——组成-直接内存详解

目录

  • 1- 引言:直接内存概述
    • 1-1 直接内存是什么?直接内存的定义(What)
    • 1-2 为什么用直接内存?Java程序对直接内存的使用 (Why)
  • 2- ⭐核心:详解直接内存(How)
    • 2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO
      • 常规 IO 的操作流程
      • NIO 的操作流程
  • 3- 小结:
    • 3-1 什么是直接内存?


1- 引言:直接内存概述

1-1 直接内存是什么?直接内存的定义(What)

  • 直接内存:并不属于 JVM 中的内存结构,不由 JVM 进行管理。是虚拟机的系统内存,常见于 NIO 操作时,用于数据缓冲区,它分配回收成本较高,但读写性能高。

1-2 为什么用直接内存?Java程序对直接内存的使用 (Why)

  • 高性能需求:直接内存的读写性能高于传统的JVM堆内存,因为减少了内存复制的次数。在进行大量数据的读写操作时,使用直接内存可以显著提高性能。
  • NIO操作:Java NIO(Non-blocking IO)库通过使用直接内存来提升IO操作的吞吐量。直接内存允许Java程序直接访问操作系统的内存,从而减少了数据在系统缓冲区和Java堆缓冲区之间复制的开销。
  • 资源共享:直接内存是操作系统内存的一部分,可以被操作系统和Java程序共享访问,这使得数据处理更加高效。
  • 避免垃圾回收:直接内存不受JVM的垃圾回收机制影响,减少了由于垃圾回收导致的性能波动,对一些高性能应用场景尤为重要。

2- ⭐核心:详解直接内存(How)

2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO

  • Java 代码完成文件拷贝
  • 场景:E:/bak1 下有文件 需要拷贝到 ——>E:/bak2 文件夹下

image.png

package com.heima.jvm;import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class DirectMemoryDemo {static final String FROM = "E:\\bak1\\01-java成神之路.mp4";static final String TO = "E:\\bak2\\abc.mp4";static final int _1Mb = 1024 * 1024;public static void main(String[] args) {io(); // 256.8563directBuffer(); // 63.2449}private static void directBuffer() {long start = System.nanoTime();try (FileChannel from = new FileInputStream(FROM).getChannel();FileChannel to = new FileOutputStream(TO).getChannel()) {ByteBuffer bb = ByteBuffer.allocateDirect(_1Mb);while (true) {int len = from.read(bb);if (len == -1) break;bb.flip();to.write(bb);bb.clear();}} catch (Exception e) {e.printStackTrace();}long end = System.nanoTime();System.out.println("NIO Time: " + (end - start) / 1e6 + " ms");}private static void io() {long start = System.nanoTime();try (FileInputStream fis = new FileInputStream(FROM);FileOutputStream fos = new FileOutputStream(TO)) {byte[] buffer = new byte[_1Mb];int len;while ((len = fis.read(buffer)) != -1) {fos.write(buffer, 0, len);}} catch (Exception e) {e.printStackTrace();}long end = System.nanoTime();System.out.println("IO Time: " + (end - start) / 1e6 + " ms");}
}

image.png

  • 结果分析:NIO 比 BIO 效率更高

常规 IO 的操作流程

  • Java本身不具备磁盘读写的能力,如果 Java 需要对磁盘进行读写,必须调用操作系统提供的函数(Native 修饰的本地方法)

①内存操作 ——> CPU状态切换

  • Java程序运行在用户态(User Space),当需要进行磁盘读写操作时,必须切换到内核态(Kernel Space)。这种切换会消耗CPU资源。

②内存操作 ——> 数据读取和缓冲区使用:

  • 通过调用操作系统的函数,将磁盘文件读取到系统缓存区中。
  • 为了避免内存占用过大,操作系统利用缓冲区分批次读取数据。

③系统缓冲区与Java缓冲区的交互:

  • 系统的缓冲区中 Java 代码无法直接运行,因此 Java 程序需要在堆内存中分配一块缓冲区(Java缓冲区)来存储数据,通常通过new byte[]的方式分配。

⑤数据复制:

  • 数据从系统缓冲区复制到Java缓冲区。
  • Java代码通过读取Java缓冲区中的数据进行操作。
  • 由于存在两块缓冲区,数据需要在两块内存中存储两次,这会导致不必要的复制操作,从而降低效率。

问题所在:多次数据复制

  • 因为数据需要从系统缓冲区复制到Java缓冲区,导致了数据的重复存储。
  • 这种多次数据复制不仅消耗内存资源,还会影响整体性能。

image.png

NIO 的操作流程

image.png

  • 在 NIO 的过程中,操作系统直接在内存中划分出了一个 直接内存 缓冲区, Java 代码也可以直接在直接访问直接内存。
  • 直接内存对于操作系统和 Java 来说都是可以共享的区域,这就是直接内存。这就是直接内存带来的好处,直接提高了文件的 IO 操作。

3- 小结:

3-1 什么是直接内存?

在这里插入图片描述

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

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

相关文章

LeetCode 热题 HOT 100 (009/100)【宇宙最简单版】

【图论】No. 0207 课程表【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff01…

小公司怎么申请企业邮箱?

小公司申请企业邮箱需要考虑哪些因素?小公司选择企业邮箱需考虑成本、功能、安全、支持等因素。小公司怎么申请企业邮箱呢?注册企业邮箱需填写企业信息、选择套餐并添加用户。 一、小公司申请企业邮箱考虑的因素 1、成本效益分析 预算规划&#xff1a…

Try ubuntu core (by quqi99)

作者:张华 发表于:2024-07-20 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) try ubuntu core on qemu #ovmf is to ensure compatibility with the re…

matlab--legend利用for循环添加图例

第一种方法 %% 第一种方法 R 1:4; THETA1 atand(R./1.8); legend_name {}; for i 1:4THETA atand(R(i)./1.8);intTheta floor(THETA);R_THERA 1.8 - (R(i)./tand(intTheta-10:intTheta10));R_THERA1 1.8 - (R(i)/tand(intTheta));plot(R_THERA);grid on;hold onlegend…

领夹麦克风哪个品牌好,电脑麦克风哪个品牌好,热门麦克风推荐

​在信息快速传播的时代,直播和视频创作成为了表达与交流的重要方式。对于追求卓越声音品质的创作者而言,一款性能卓越的无线麦克风宛如一把利剑。接下来,我要为大家介绍几款备受好评的无线麦克风,这些都是我在实际使用中体验良好…

SpringBoot大模型流式接口

话不多说,直接上货 import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

人工智能(AI)在办公场所的广泛应用

人工智能(AI)在办公场所的广泛应用正逐步改变着我们的工作方式和效率。随着技术的进步,越来越多的公司和组织开始采用各种AI技术来优化工作流程、提升生产力,并提供更好的用户体验。以下是人工智能在办公方面的一些主要作用和影响…

LeetCode 125.验证回文串 C++写法

LeetCode 125.验证回文串 C写法 思路🤔: 我们不对字符串进行删除,这样效率太低了,所以可以左右开工,下标begin和end遇到不是字母数字字符的就跳过,当两边都是字母就进行比对,一样就继续往后走&a…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么?二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理,比如在预处理,保存点云时。下面提供一个简单的点云批量转换例子,PCD文件…

power bi 度量值相关函数

power bi 度量值相关函数 1. 度量值的好处2. 度量值上下文3. calculate() 函数4. 度量值存储方式 1. 度量值的好处 度量值不会增加一列,不会修改表格度量值自带筛选功能 2. 度量值上下文 新建行和新建度量值的区别 度量值是筛选上下文:度量值天生具有…

机器学习 | 阿里云安全恶意程序检测

目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…

SimGCL和XSimGCL

SimGCL 动机 传统的SGL(图自监督学习)使得模型可以自行发掘任务特征,解决了数据稀疏和长尾分布的问题,SGL采用节点dropout、边dropout和随机游走三种方式对图结构进行扰动(图增强)进行对比学习,可以有效提高性能 SGL主要解决传统推荐系统面临的数据稀疏和长尾分布问题。…

2024中国大学生算法设计超级联赛(1)

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 📢📢📢传送门 A - 循环位移解…

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数,它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析: 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…

【简历】贵州某二本学院:JAVA秋招简历指导,简历通过率基本为0

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份某师范学院25届二本同学的Java简历。这种就是每年都会出现的少量的完全不知道简历应该怎么写的同学。 所以这个简历&#xff0…

Java实现七大排序(一)

目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.选择排序 2.堆排序 三.总结 一.插入排序 1.直接插入排序 直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序,方法就是一张一张对。直接插入排序也是这样的,我们得到一张…

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错:虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机,查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址:Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错:error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…

力扣3226 使两个整数相等的位更改次数

写的代码&#xff1a; class Solution { public:string cc(int num){string res"";while(num>0){int rnum % 2;resstatic_cast<char>(48r)res;num/2;}return res;}int minChanges(int n, int k) {int res0;string n2cc(n);string k2cc(k);int n_sizen2.siz…