当前位置: 首页 > news >正文

黑马JVM总结(十)

(1)直接内存_基本使用

下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高

Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法,设计到了cpu的用户状态变为内核态,切换到内核态以后,由cpu的函数去读取磁盘文件的内容,会在操作系统中划出来一份缓冲区叫做系统缓冲区,磁盘内容读取到系统缓冲区,用系统缓冲区分次读取内容,Java这边会在堆内存中分配一个java的缓冲区,从系统缓冲区间接读取到java的缓冲区,然后再去调用下一个状态输出流的写入操作,这样反复读写

这样有两个缓冲区,先读取到系统缓冲区,然后在读取到java的缓冲区,这样造成了不必要的复制,效率不高,下面我们看使用了

当调用allocateDirect方法的时候,会分配一块直接内存,这个方法调用以后会在操作系统那边划分一块缓冲区,direct memory 这个区,java代码是可以直接读取这个区的,可以直接访问,是系统可以访问,java代码也可以访问,是两个共享的一个区域,叫做直接内存:

磁盘文件可以读取到直接内存,java代码可以直接访问直接内存,比上面少了一次缓冲区的复制操作,速度得到了成倍提升

它适合做这个文件的io操作

(2)直接内存_内存溢出

循环分配占用内存

 爆了直接内存溢出:

 (3)直接内存_释放原理

直接内存,不受我们虚拟机管理,那么它分配的内存会不会正确回收,底层是怎么实现的

不用java工具去检测了,因为java工具只能看到java管理的堆堆内存,直接内存不受java管理,我们通过系统的任务管理器java进程对内存的占用

运行代码:多了一个进程 

进行释放,把ByteBuffte设为空,ByteBuffte的回收会不会把直接内存占用的内存回收掉呢,看左侧那个java进程也没有了 

System.gc() 垃圾回收怎么会导致直接内存回收的呢?不是上面说不受jvm垃圾回收的管理吗?

ByteBuffer底层的分配和释放内存的相关的类型是java中的非常底层的类unfafe

程序运行分配一个1g的内存:

 回车释放内存:

这样我们就验证了直接内存的分配和释放是通过一个Unsafe对象来管理的,并不是垃圾回收,垃圾回收只能释放java的内存,垃圾回收只能对java中无用的对象释放是自动的不需要手动来调用任何方法,直接内存不同他需要主动来调用unsafe.freeMemory的方法才能完成对内存的释放

(4)ByteBuffer原码

进去这个方法,发现它的构造器直接调用的上面我们学的unsafe对象 

Cleaner对象关联Deallocator回调任务对象:主动释放直接内训 

Cleaner是一个特殊的类型叫做虚引用类型,它的特点是它所关联的对象被回收时,Cleaner会触发它的一个clean方法,他关联的是this就是ByteBuffer ,当ByteBuffer这个java对虚拟机回收时,触发clean方法,这个clean方法会触发任务对象的run方法

clean这个方法不是在主线程中执行的,是在后台一个叫referenceHandler的线程专门检测虚引用对象,当虚引用对象关联的DirectByteBuffer被回收掉以后会调用虚引用对象里面的clean方法然后去执行任务对象中的run方法去调用freeMemory方法区释放内存

所以我们直接内存的释放是借助了java中虚引用的机制 

(5)直接内存_禁用显示回收对直接内存的影响

有一个问题:

Full GC:不仅要回收新生代还要回收老年代

-XX:+DisableExplicitGC:禁用显示的垃圾回收  让System.gc()无效

加上那个设置参数后可能会影响直接内存的回收:

加了禁用参数后,虽然写了但是System.gc()是无效的,不会触发java的垃圾回收,ByteBuffer由于内存充裕,这个对象就不会呗回收,它所对应的那块直接内存也没有被回收

ByteBuffer只能等到真正的垃圾回收时,它对应的那块直接内存才能被释放掉,就会导致直接内存占用较大,长长得不到释放

怎么解决呢?可以直接使用Unsafe对象,手动的直接管理 

相关文章:

黑马JVM总结(十)

(1)直接内存_基本使用 下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高 Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法&#xff0c…...

JPEG、GIF动图可以转换成SVG、Eps格式的矢量图吗?

在进行图片设计的过程中,我们可能需要很多不同格式的图片,例如 JPG、PNG、BMP 和 GIF 位图图像,怎么将这些图片转换成矢量图呢?一款功能强大的应用程序,能够轻松将位图图片转换成矢量图输出。Vector Magic会帮你进行自…...

数据结构与算法的力量:编写更高效的代码

文章目录 为什么数据结构和算法重要?1. 提高性能2. 节省资源3. 解决复杂问题4. 改进代码质量 常见数据结构和算法数据结构1. 数组(Array)2. 链表(Linked List)3. 栈(Stack)4. 队列(Q…...

Python批量统计pdf中“中文”字符的个数

之前的文章提供了批量识别pdf中英文的方法,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文上。以及自动pdf英文转中文文档,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文下。以及Python统计pdf中英文单词的个数。    本文实现Python统计pdf中中文字符的…...

LeetCode的第 363 场周赛——记录+补题

研究生生涯第一次打力扣周赛——3题 1. 计算 K 置位下标对应元素的和 class Solution { public:int cnt(int x){int sum 0;while (x) {sum ((x%2)?1:0);x/2;}return sum;}int sumIndicesWithKSetBits(vector<int>& nums, int k) {int n nums.size();int ans 0…...

【网络协议】Http-上

Http请求结构&#xff1a; 结构图1&#xff1a; 实验解析请求报文&#xff1a; 1.在Edge浏览器上输入ip地址端口号文件资源&#xff0c;也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1)&#xff0c;如下 GET …...

Langchain-chatchat本地部署

Langchain-chatchat本地部署 参考官网 环境配置 conda安装 minicoda下载地址 安装时注意勾选上添加环境变量。安装完成之后使用conda --version测试一下版本。 环境创建 先配置一下conda的镜像地址&#xff08;使用阿里的靠谱一些&#xff09;&#xff0c;这里要修改一下…...

SQL故障和排查解决浅析

MySQL长连接 MySQL长连接是指应用程序与MySQL数据库之间的连接在执行完一个操作后不会立即关闭&#xff0c;而是保持活动状态以供后续使用。这种连接模式在某些情况下可以提高性能&#xff0c;但也可能导致一些问题。以下是MySQL长连接的一些现象和排查方法&#xff1a; 现象…...

基础算法--双指针算法

双指针算法 1.基本介绍 严格的来说&#xff0c;双指针只能说是是算法中的一种技巧。 双指针指的是在遍历对象的过程中&#xff0c;不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向&#xff08;快慢指针&#xff09;或者相反方向&#xff08;对撞指针&#…...

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...

生物的神经系统与机器的人工神经网络

生物的神经系统与机器的人工神经网络 文章目录 前言一、人工神经网络二、生物的神经系统三、关系四、相似与区别4.1. 相似&#xff1a;4.2. 区别: 总结 前言 因为本人是学生物的&#xff0c;并且深度学习的核心——人工神经网络与生物的神经系统息息相关&#xff0c;故想要在本…...

JNI 基础

一、JNI 涉及的名词概念 1.1、 JNI&#xff1a;Java Native Interface 它是Java平台的一个特性(并不是Android系统特有的)。实现Java代码调用C/C的代码&#xff0c;C/C的代码也可以调用Java的代码. 1.2、 二进制库分类 &#xff1a; 静态库&#xff0c;动态库. 静态库 系统…...

用户参数(zabbix-agent)

-s 指向被监控端地址 -p 指向被监控端端口 -k 指向key的名字 监控内存使用率 agent vi a.conf server web界面 对数据库的avg进行监控 systemctl 创建监控项 另一台 重启 agent 监控请求数 运行时间 对自定义key的理解 写下想要监控的任何参数命令&#xff0c;利用zabbix…...

期权策略篇: 实现买方狂欢,让卖方稳赚不赔的策略

欢迎来到期权策略篇: 实现买方狂欢&#xff0c;让卖方稳赚不赔的策略&#xff0c;今天给大家带来的期权策略比较简单&#xff0c;是我们比较常见的四种单腿期权策略&#xff0c;这四种策略分别是买入看涨期权、买入看跌期权、卖出看涨期权、卖出看跌期权策略。本文来自&#xf…...

关于包,类名,方法名的命名规范

保持与数据库同名的一个命名规范的规则 方法名采用驼峰命名法&#xff0c;保持与数据库同名的一个命名规范的规则 类名采用首字母大写&#xff0c;驼峰命名法&#xff0c;保持与数据库同名的一个命名规范的规则 包名全部使用小写&#xff0c;保持与数据库同名的一个命名规范的规…...

1.1 安装配置CentOS

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;安装VMWare Workstation1、获取安装程序2、进入安装向导3、按提示完成安装 &#xff08;二&#xff09;虚拟网络编辑器1、启动虚拟网络编辑器2、选择VMnet8虚拟网3、更改网络配置4、查看DHCP设置5、查…...

go初识iris框架(七) - 实战资源导入和项目框架搭建

实战项目框架搭建 如下是项目框架搭建后的说明&#xff1a; config:&#xff1a;项目配置文件及读取配置文件的相关功能controller:控制器目目录,项目各个模块的控制器及业务逻辑处理的所在目录datasource:实现mysql连接和操作、封装操作mysql数据库的目录。model:数据实体目…...

甲胎蛋白AFP抗体——博迈伦

甲胎蛋白&#xff08;Alpha-fetoprotein&#xff0c;AFP&#xff09;是一种由胚胎组织产生的蛋白质&#xff0c;通常以胎儿肝脏和胎盘为主要来源。AFP是一种重要的生物标志物&#xff0c;可用于诊断和预测某些疾病的发展情况。 AFP抗体是指能够与AFP结合的抗体&#xff0c;通常…...

junit.Test误踩坑,识别不到@Test注解,无法运行测试方法

问题的出现源自于下面的一段代码&#xff1a; 在这一段代码中&#xff0c;只看到可以运行的main方法&#xff0c;无法看到test方法可以运行的标志。 只能运行main()方法。 开始排查&#xff0c;对junit包的导入进行检查&#xff0c;发现是没有问题的。 怀疑是否是IntelliJ IDE…...

一加Ace2V/Ace竞速版刷入氧OS13系统-谷歌服务套件-全球语言-国际版体验

截止目前2023年9月5日&#xff0c;一加除了刚上市的Ace2Pro机型未确定国际版以外&#xff0c;其他机型均可以支持氧OS系统刷入。今天我们刷入的就是一加Ace2V和一加Ace竞速版本&#xff0c;两款机型均为MTK天玑处理器&#xff0c;并且系统已经升级了COlorOS13系统&#xff0c;所…...

别再硬编码了!Qt QTabBar标签宽度自适应窗体的5种实战方案对比(附完整代码)

Qt QTabBar标签宽度自适应窗体的5种实战方案深度评测 每次看到Qt界面中那些挤在一起或稀疏分布的标签页&#xff0c;总让人想起超市货架上摆放不齐的商品——既影响美观又降低使用效率。作为中级Qt开发者&#xff0c;你一定遇到过这样的困境&#xff1a;当窗体尺寸变化时&#…...

Agent 性能优化:降低 Token 消耗的 5 个技巧

Agent 性能优化&#xff1a;降低 Token 消耗的 5 个技巧系列文章&#xff1a; 《AI Agent 开发实战》第 7 期 难度等级&#xff1a; ⭐⭐⭐⭐ 预计耗时&#xff1a; 35 分钟&#x1f3af; 本文目标 学会优化 AI Agent 性能&#xff1a; ✅ 减少 Token 消耗✅ 提高响应速度✅ 降…...

UniApp+Vue3避坑指南:为什么getAppWebview会失效?从原理到解决方案

UniAppVue3深度解析&#xff1a;getAppWebview失效的底层逻辑与工程化解决方案 在UniApp与Vue3的技术栈组合中&#xff0c;不少开发者遭遇过getAppWebview神秘失效的困境。这个看似简单的API调用问题&#xff0c;背后却隐藏着Vue3响应式系统变革与UniApp多端渲染机制的深层交互…...

如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南

如何快速掌握Windows文件夹色彩管理&#xff1a;Folcolor免费工具终极指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 你是否曾在密密麻麻的黄色文件夹中迷失方向&#xff1f;每天花费…...

SGMICRO圣邦微 SGM6512YTS28G/TR TDFN-8L(2x2) 模拟开关/多路复用器

特性 典型导通电阻240120开路电阻平坦度3.3V至6V双电源供电操作3.3V至13.2V单电源工作电压-3dB带宽:70MHz轨到轨操作提供绿色TQFN-5x5-32L和TSSOP-28封装 工作温度范围:-40C至85C...

Cursor功能增强工具使用指南

Cursor功能增强工具使用指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request limit. / Too many free t…...

Delphi 终极实战:将自定义控件打包成 BPL,安装到 Delphi 工具栏(组件库实战)

前面我们手写了专属 UI 组件库&#xff08;MyUIClass.pas&#xff09;&#xff0c;但如果你想在以后的项目中一键调用这些控件&#xff0c;而不是每次都复制粘贴代码&#xff0c;那就必须将它们打包成 Delphi 组件包&#xff08;BPL 文件&#xff09;。学会这篇&#xff0c;你将…...

网络工程师-核心考点:计算机硬件基础全解析

一、引言计算机硬件基础是软考网络工程师考试的前置知识点&#xff0c;占选择题分值约 3-5 分&#xff0c;是理解网络设备&#xff08;路由器、交换机、服务器&#xff09;硬件架构的底层基础。本知识点体系起源于 1945 年冯・诺依曼提出的存储程序思想&#xff0c;历经 70 余年…...

UE5 UI控件实战指南 —— 从基础到高级交互设计

1. UE5 UI控件基础入门 第一次打开UE5的UMG编辑器时&#xff0c;看到琳琅满目的控件面板可能会有点懵。别担心&#xff0c;我们先从最基础的Image和Text控件开始&#xff0c;就像学画画先从线条练起一样。 Image控件相当于你的画布。我习惯先在内容浏览器里右键创建"用户界…...

告别蓝牙!用STM32F103和NRF24L01搭建低成本2.4G无线通信,实测传输距离与稳定性

STM32F103与NRF24L01构建高性能2.4G私有通信系统实战指南 在物联网设备爆发式增长的今天&#xff0c;无线通信模块的选择成为硬件开发者面临的首要难题。面对市面上琳琅满目的蓝牙、Wi-Fi和私有协议模块&#xff0c;如何根据项目需求选择最具性价比的解决方案&#xff1f;本文将…...