JVM 如何操作缓冲区

【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二) 缓冲区既,也,具体取决于你讨论的是哪个层面的缓冲区。下面我会详细解释这两者的区别和联系。 阅读详情

正常情况下,JVM创建一个缓冲区的时候,实际上做了如下几件事:


  1. JVM确保Heap区域内的空间足够,如果不够则使用触发GC在内的方法获得空间;


  2. 获得空间之后会找一组堆内的连续地址分配数组, 这里需要注意的是,在物理内存上,这些字节是不一定连续的;


对于不涉及到IO的操作,这样的处理没有任何问题,但是当进行IO操作的时候就会出现一点性能问题.


所有的IO操作都需要操作系统进入内核态才行,而JVM进程属于用户态进程, 当JVM需要把一个缓冲区写到某个Channel或Socket的时候,需要切换到内核态.


而内核态由于并不知道JVM里面这个缓冲区存储在物理内存的什么地址,并且这些物理地址并不一定是连续的(或者说不一定是IO操作需要的块结构),所以在切换之前JVM需要把缓冲区复制到物理内存一块连续的内存上, 然后由内核去读取这块物理内存,整合成连续的、分块的内存.


为了解决这个问题, Java的某些版本会把物理区域分配好的部分内存做缓存就不用每次都开辟一块空间,但效果还不够好,毕竟复制的部分是少不了的.


JDK1.4之后引入了NIO, 提供了一种内存映射技术, 让我们可以直接从Java代码中创建DirectBuffer,这种Buffer在创建的时候直接就在物理内存中分配一块连续内存,当需要使用的时候不再需要复制,内核直接调用即可. 但缺点也是显而易见的,就是每次分配都比较昂贵一点,同时由于分配的内存不在Java Heap中,所以也不会受用户设置的堆大小的限制.


通常情况下,大量使用IO操作的时候使用内存映射是非常值得的,下面是我画的一张图,方便记忆:



来源:搜不狐,

sobuhu.com/program/2013/12/20/java-create-bytes.html


【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一) 缓冲区是操作系统和 Java 运行时环境(JVM)内部的一个机制,,因为它是由操作系统和 JVM 管理的。不过,我可以详细解释它的工作原理,以及如何通过代码间接观察到它的存在。 阅读详情

相关推荐

跨境TRS投资实战:从开户到交易的完整系统解析

本文系统解析了跨境TRS(总收益互换)投资的完整实战流程。详细阐述了TRS作为境外资金投资A股的灵活工具,如何通过其独特的合约结构绕开港股通限制,并提供杠杆效应。内容涵盖从选择机构、开通账户、资金管理到核心交易操作的全过程,并强调了构建包含策略、风控与心态的完整投资系统的重要性。

weixin_29233333的博客 314

JVM代码缓存区CodeCache原理及用法解析

大家都知道javac编译器,把java代码编译成class字节码,它和JIT编译器的区别是,javac只是前端编译(有的叫前期编译),jvm是通过执行机器码和底层交互的,这样我们编写的业务代码才能生效。方法计数器,统计被多次调用的方法次数,该计数器统计的并不是方法被调用的绝对次数,而是在一段时间内方法被调用的次数。上面讲到了JVM会对频繁使用的代码,即热点代码(Hot Spot Code),达到一定的阈值后会编译成本地平台相关的机器码,并进行各层次的优化,提升执行效率。

digital2013的博客 2615

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 270

多级缓冲-JVM

JVM进程缓冲(JVM Process Buffer)是Java虚拟机(JVM)中的一种重要机制,它用于在Java应用程序和操作系统之间进行数据交换。JVM进程缓冲是JVM内存管理的一部分,它可以帮助Java应用程序更好地处理数据,从而提高程序的性能。一、JVM进程缓冲的概念JVM进程缓冲是JVM为Java应用程序分配的内存区域,用于存储Java对象和数据。JVM进程缓冲通常分为三个部分:堆(Heap)、栈(Stack)和程序计数器(Program Counter)。二、JVM进程缓冲的工作原理。

m0_65144570的博客 146

1553B总线介绍及其硬件方案设计

军用1553B总线 1.简介 简单介绍可参考(https://blog.youkuaiyun.com/ScilogyHunter/article/details/108444231)博主写的很详细。 1553B总线是MIL-STD-1553总线的简称,其中B就是BUS,MIL-STD-1553B总线是飞机内部时分制命令/响应式多路复用数据总线。1553B数据总线标准是20世纪70年代由美国公布的一种串行多路数据总线标准。1553B总线能挂31个远置终端,1553B总线采用指令/响应型通信协议,它有三种终端类型: BC:

小幽余生不加糖 1万+

城市仿真软件:AnyLogic_(8).行人与人群动态仿真

定义行人个体的行为和属性,如行走速度、目标位置等。// 创建一个行人// 设置行走速度为1.5 m/s// 设置目标位置为入口// 创建另一个行人// 设置行走速度为1.2 m/s// 设置目标位置为出口// 创建行人// 创建乘客行人与人群动态仿真在城市规划、交通管理和紧急疏散等领域具有广泛的应用。通过AnyLogic提供的行人模型模块,可以有效地模拟行人的个体行为、群体动态和与环境的交互。

kkchenjj的博客 1250

JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)

当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是有内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如,Java 以 JVM 为目标,而 HotSpot JVM 是用 C++ 编写的),因此接口会变得更加模糊。而这种操作成本是相当高的,并且内存管理器也必须应对多线程场景下进行内存请求多压力。为了使Java程序的运行效率尽可能接近C++等语言的运行效率,针对JVM的内存管理器的执行效率需要进行优化。

nanxiaotao的博客 1268

华为OD 面试手撕代码真题【判断链表是否有环】

华为OD 面试手撕代码真题【判断链表是否有环】

MISAYAONE的博客 7239

深入理解JVM—JVM内存模型

我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子。 同样,根据摩尔定律,我们知道单核 CPU的主频不可能无限制的增长,要想很多的提升新能,需要多个处理.

woaitingting1985的博客 258

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 375

Unity 之如何使用Pico4u锚点功能实现一个世界锁GameRoot

摘要 空间锚点技术是混合现实(MR)应用的核心,能永久记录虚拟物体的空间位置。文章介绍了在Unity中使用Pico SDK实现空间锚点的完整流程:1)环境配置需安装XR模块和Pico SDK;2)关键操作包括启动空间感知、创建/删除/查询/更新锚点;3)提供了经典应用案例,通过GameRoot节点实现场景固定和锚点同步。源码展示了基于XR交互工具包的锚点抓取与位置更新实现,为MR开发提供了实用参考方案。

TxNet 972

JVM复习总结

JVM 运行时数据区域 根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。 程序计数器 内存空间小,线程私有. 字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行指令的字节码指令(主要是取下一条指令的字节码文件). 分支,循环,跳转,异常处理,线程恢复等基础功能都依赖程序计数器来完成. 如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址 ; 如果正在执行的是Native方法, 这个计数器记录的值为(U

卓原的进化之旅 881

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

808

java如何设置缓冲区_JVM 如何操作缓冲区

原标题:JVM 如何操作缓冲区来源:搜不狐,sobuhu.com/program/2013/12/20/java-create-bytes.html正常情况下,JVM创建一个缓冲区的时候,实际上做了如下几件事:JVM确保Heap区域内的空间足够,如果不够则使用触发GC在内的方法获得空间;获得空间之后会找一组堆内的连续地址分配数组, 这里需要注意的是,在物理内存上,这些字节是不一定连续的;对于不涉及...

weixin_42427882的博客 829

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JVM如何操作缓冲区

转载自:http://sobuhu.com/program/2013/12/20/java-create-bytes.html 正常情况下,JVM创建一个缓冲区的时候,实际上做了如下几件事: JVM确保Heap区域内的空间足够,如果不够则使用触发GC在内的方法获得空间; 获得空间之后会找一组堆内的连续地址分配数组, 这里需要注意的是,在物理内存上,这些字节是不一定

每一次对问题的深究,总会收获新的知识和体会 1786

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于直接缓冲区和非直接缓冲区的javaIO文件操作

基本概念: 1. 非直接缓冲区: 指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反。 2. 直接缓冲区:指不通过应用程序读取磁盘的文件时不用经过jvm,而是直接由本地磁盘到物理内存,然后到应用程序。 对比:直接缓冲方式会比非直接缓冲方式快,不过在保存文件到本地过程中,文...

banbi4983的博客 276

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java NIO(九) 缓冲区——字节缓冲区&&直接缓冲区

字节缓冲区,顾名思义“缓冲”对象是字节,但是字节缓冲区又是一个特殊的缓冲区,因为字节是操作系统及其IO设备使用的基本数据类型。 字节缓冲区和其他缓冲区最明显的区别在于,他们可以成为通道所执行的IO的源头和目标。通道只接收ByteBuffer作为参数。 直接缓冲区: 在jvm中,字节数组可能不会在内存中连续存储,或者无用存储单元收集可能随时对其进行移动。在java中,数组是对象,而数据存储在对

裴珏的专栏 2433

NIO之缓冲区【直接和非直接缓冲区】

直接与非直接缓冲区   字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Channel的时候会发现。 类型 优点 缺点 直接缓冲区 在虚拟机内存外,开辟的内存, IO操作直接进行,没有再次复制 创建和销毁开销大 非直接缓冲区 在虚拟机内存中创建,易回收 但占用虚...

一介布衣的博客 665

NIO之直接缓冲区与非直接缓冲区

直接缓冲区与非直接缓冲区的概念 一、非直接缓冲区 1)创建方式 通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在JVM内,因此销毁容易,但是占用JVM内存开销...

dichengyan0013的博客 254

Java-NIO(三):直接缓冲区与非直接缓冲区

直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在JVM内,因此销毁容易,但是占用JVM内存开销,处理过程中有复制操作。

nn2345的博客 958

直接缓冲区 与 非直接缓冲区

非直接缓冲区: 通过allocate()方法分配缓冲区,将缓存区建立在JVM内存中 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在JVM内,因此销毁容易,但是占用JVM内存开销,处理过程中...

sakuragio的博客 311

Java Nio (三):直接缓冲区 和 非直接缓冲区

/** 4,直接缓冲区与非直接缓冲区: * 非直接缓冲区 : 通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中。 * 直接缓冲区 : 通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率。 */ //创建直接缓冲区 ByteBuffer buf = ByteBuffer.allocateDirect(1024...

345丶 1262

Java NIO -- 直接缓冲区与非直接缓冲区

直接缓冲区与非直接缓冲区: 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率 字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在机 此缓冲区上执行本机 I/O 操作。也就是说...

A08110123的博客 192

NIO直接缓冲区释放内存的方法

创建堆缓冲区与直接缓冲区 allocateDirect(int capacity): 分配新的直接字节缓冲区.新的缓冲区的位置将为0,其界限为其容量,其标记是不确定的.无论它是否具有底层实现数组,其标记都是不确定的. allocate(int capacity): 分配一个新的非直接字节缓冲区.新缓冲区的位置为0,其界限为其容量,其标记是不确定的.它将具有一个底层实现数组,且其数组偏移量将为0. ...

weixin_34067102的博客 1168

直接缓冲区

原创转载请注明出处:http://agilestyle.iteye.com/blog/2360210   直接缓冲区( ByteBuffer.allocateDirect() ) (1)通道只接收  ByteBuffer 作为参数 (2) 操作系统的在内存区域中进行 I/O 操作。就操作系统方面而言, 这些内存区域是相连的字节序列 。于是, 只有字节缓冲区有资格参与I/O 操作 。操作...

jvisualvm 347
上一篇: Java 中关于 String 类型的 10 个问题
下一篇: 25 个常用的 Linux iptables 规则
bb_it007
博客等级 码龄10年 15粉丝 0原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值