黑马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对象,手动的直接管理 

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

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

相关文章

bboss 流批一体化框架 与 数据采集 ETL

数据采集 ETL 与 流批一体化框架 特性: 高效、稳定、快速、安全 bboss 是一个基于开源协议 Apache License 发布的开源项目,主要由以下三部分构成: Elasticsearch Highlevel Java Restclient , 一个高性能高兼容性的Elasticsea…

【C刷题】day2

一、选择题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; } A: 12 B: 13 C: 16 D: 以上都不对【答案】&#xff1a; A 【解析】…

Python Opencv实践 - 视频文件写入(格式和分辨率修改)

参考资料&#xff1a; python opencv写视频——cv2.VideoWriter()_cv2.cv.videowriter(_翟羽嚄的博客-CSDN博客 import cv2 as cv import numpy as np#1. 打开原始视频 video_in cv.VideoCapture("../SampleVideos/Unity2D.mp4") video_width int(video_in.get(c…

带你了解前后端分离的秘密-Vue【vue入门】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

无涯教程-JavaScript - ATAN2函数

描述 The ATAN2 function returns the arctangent, or inverse tangent, of the specified x- and ycoordinates, in radians, between -π/2 and π/2. 语法 ATAN2 (x_num, y_num)争论 Argument描述Required/OptionalX_numThe x-coordinate of the point.RequiredY_numThe…

用c++实现五子棋小游戏

五子棋是一款经典小游戏&#xff0c;今天我们就用c实现简单的五子棋小游戏 目录 用到的算法&#xff1a; 思路分析 定义变量 开始写代码 完整代码 结果图&#xff1a; 用到的算法&#xff1a; 合法移动的判断&#xff1a;isValidMove 函数通过检查指定位置是否在棋盘范…

游戏视频录制软件对比,哪款最适合你的需求?

随着电子竞技和游戏直播行业的迅速崛起&#xff0c;越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间。游戏视频录制软件正是满足这一需求的关键工具。本文将针对三款优秀的游戏视频录制软件进行对比分析&#xff0c;以便为读者提供选购建议。 游戏视频录制软件1&#xff1…

十天学完基础数据结构-第一天(绪论)

1. 数据结构的研究内容 数据结构的研究主要包括以下核心内容和目标&#xff1a; 存储和组织数据&#xff1a;数据结构研究如何高效地存储和组织数据&#xff0c;以便于访问和操作。这包括了在内存或磁盘上的数据存储方式&#xff0c;如何将数据元素组织成有序或无序的集合&…

移动端H5封装一个 ScrollList 横向滚动列表组件,实现向左滑动

效果&#xff1a; 1.封装组件&#xff1a; <template><div class"scroll-list"><divclass"scroll-list-content":style"{ background, color, fontSize: size }"ref"scrollListContent"><div class"scroll…

C# OpenVino Yolov8 Pose 姿态识别

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenVino_Yolov8_Demo {public…

独立开发了一款Material3风格的RSS阅读器 - Agr Reader

截图 背景&#x1f4d6; 在之前接触到RSS后&#xff0c;发现RSS真是一个十分不错的信息聚合的方式&#xff0c;虽然现在看来RSS的时代已经开始落幕&#xff0c;但是至少目前还是处于能用的阶段。 在我用了Android上好几个RSS阅读App后&#xff0c;发现很多在全文解析方面不是…

Mapbox gl HTML经纬度点渲染,动态轨迹播放,自定义图形以及轨迹上显示箭头方向

Mapbox gl HTML经纬度点渲染&#xff0c;动态轨迹播放&#xff0c;自定义图形以及轨迹上显示箭头方向 1. 效果图2. 源码2.1 line.html2.2line_arrow.html 参考 今天要排查个问题&#xff0c;需要显示多个经纬度点连接成线段的方向&#xff0c;于是尝试下展示。 1. mapbox渲染经…

element plus封装el-select添加后缀图标并添加远程搜索和对话框功能

当提交的表单Form需要填某个实体的外键ID时&#xff0c;当然不可能使用el-input组件&#xff0c;这个适合提交字符串&#xff0c;然后用户又不可能记住某个引用的外键ID&#xff0c;这时候使用el-select还是必要的。 el-select组件一般都作为下拉选择框使用&#xff0c;但仅在…

远程计算机控制软件

远程控制软件允许您连接和控制位于不同位置的设备&#xff0c;对于 IT 帮助台技术人员来说&#xff0c;这是一个很好的工具&#xff0c;可以通过与用户协作、与他们聊天以及安全地访问他们的文件来轻松排除故障和修复远程设备。使用远程控制软件&#xff0c;距离不再是提供技术…

无涯教程-JavaScript - ATAN函数

描述 The ATAN function returns the arctangent, or inverse tangent, of a number. The returned angle is given in radians between -π/2 and π/2. The arctangent is the angle whose tangent is number. 语法 ATAN (number)争论 Argument描述Required/OptionalNumb…

Vulnhub实战-prime1

前言 VulnHub 是一个面向信息安全爱好者和专业人士的虚拟机&#xff08;VM&#xff09;漏洞测试平台。它提供了一系列特制的漏洞测试虚拟机镜像&#xff0c;供用户通过攻击和漏洞利用的练习来提升自己的安全技能。本次&#xff0c;我们本次测试的是prime1。 一、主机发现和端…

Jmeter性能实战之分布式压测

分布式执行原理 1、JMeter分布式测试时&#xff0c;选择其中一台作为调度机(master)&#xff0c;其它机器作为执行机(slave)。 2、执行时&#xff0c;master会把脚本发送到每台slave上&#xff0c;slave 拿到脚本后就开始执行&#xff0c;slave执行时不需要启动GUI&#xff0…

【机器学习】文本多分类

声明&#xff1a;这只是浅显的一个小试验&#xff0c;且借助了AI。使用的是jupyter notebook,所以代码是一块一块&#xff0c;从上往下执行的 知识点&#xff1a;正则删除除数字和字母外的所有字符、高频词云、混淆矩阵 参考&#xff1a;使用python和sklearn的中文文本多分类…

DS相关题目

DS相关题目 题目一&#xff1a;消失的数字 拿到这道题目之后&#xff0c;首先可以想到的一个解题方法就是&#xff0c;我们可以先排序&#xff0c;排完序之后&#xff0c;这个数组其实就是一个有序的数组了&#xff0c;那只用比较数组中的每一个元素和他对应的下标是不是相等的…

代码管理工具git1

ctrl 加滚轮 放大字体 在计算机任意位置单击右键&#xff0c;选择&#xff1a;&#xff1a;Git Bash Here git version git清屏命令&#xff1a;ctrl L查看用户名和邮箱地址&#xff1a; $ git config user.name$ git config user.email修改用户名和邮箱地址&#xff1a;$ git…