当前位置: 首页 > 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;所…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...