JVM基础篇-直接内存

JVM基础篇-直接内存

什么是直接内存?

直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm

传统方式读取文件

在这里插入图片描述

  • 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到操作系统缓冲区中
  • 然后从内核态切换到用户态,从系统缓冲区复制数据到Java堆缓冲区中

利用直接内存读取文件

在这里插入图片描述

  • 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到直接内存中
  • java可以直接访问直接内存,而不用进行再次复制,从而效率得到成倍提升

直接内存溢出

在这里插入图片描述

直接内存也会出现内存溢出,所以使用时需要小心

探究ByteBuffer

  • 演示Unsafe对象的使用
/*** @apiNote 直接内存是通过Unsafe对象的freeMemory方法完成内存释放而不是通过JVM自动垃圾回收*/
public class Demo10 {static int _1GB = 1024 * 1024 * 1024;public static void main(String[] args) throws Exception {Unsafe unsafe = getUnsafe();long base = unsafe.allocateMemory(_1GB);//分配直接内存,返回内存地址unsafe.setMemory(base, _1GB, (byte) 0);System.in.read();unsafe.freeMemory(base);//释放内存System.in.read();}public static Unsafe getUnsafe() {try {Field f = Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(true);Unsafe unsafe = (Unsafe) f.get(null);return unsafe;} catch (NoSuchFieldException | IllegalAccessException e) {throw new RuntimeException(e);}}
}

ByteBuffer是怎么声明直接内存和回收内存的呢?

在这里插入图片描述

  • 可以看出底层声明内存采用Unsafe对象声明,而垃圾回收交给Cleaner对象进行管理

在这里插入图片描述

  • 当虚ByteBuffer对象被回收时,会自动触发任务的run方法,该run方法会自动调用Unsafe对象的释放内存方法

在这里插入图片描述

🔖当jvm设置为禁用显式的垃圾回收时,直接内存只有到下次真正的垃圾回收时才会被释放,需要解决这个问题可以通过Unsafe对象手动回收这部分内存

-XX:+DisableExplicitGC //禁用显式的垃圾回收 相当于禁用System.gc()

总结

  • 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
  • ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存

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

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

相关文章

openGauss学习笔记-29 openGauss 高级数据管理-UNION子句

文章目录 openGauss学习笔记-29 openGauss 高级数据管理-UNION子句29.1 语法格式29.2 示例29.2.1 UNION29.2.2 UNION ALL openGauss学习笔记-29 openGauss 高级数据管理-UNION子句 UNION计算多个SELECT语句返回行集合的并集。UNION内部的SELECT语句必须拥有相同数量的列&#…

【微信小程序】父组件修改子组件数据或调用子组件方法

一、使用场景 页面中用到了自定义组件形成父子组件关系,在父组件某个特定时期想要操作子组件中的数据或方法,比如离开页面的时候清空子组件的数据。 二、方法 父组件可以通过this.selectComponent方法获取子组件实例对象,这样就可以直接访…

新一代开源流数据湖平台Apache Paimon入门实操-上

文章目录 概述定义核心功能适用场景架构原理总体架构统一存储基本概念文件布局 部署环境准备环境部署 实战Catalog文件系统Hive Catalog 创建表创建Catalog管理表查询创建表(CTAS)创建外部表创建临时表 修改表修改表修改列修改水印 概述 定义 Apache Pa…

【Spring】Spring之配置类解析源码解析

代码入口: // 创建一个Spring容器 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);核心代码: // AnnotatedBeanDefinitionReader#register // componentClasses为传入的AppConfig.…

【MFC】02.文件类与常用基础控件-笔记

基本概念 MFC Microsoft Fundation class 微软基础类库 框架 基于Win32 SDK进行的封装 属性:缓解库关闭 属性->C/C/代码生成/运行库/MTD 属性->常规->MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库 SD…

Ubuntu Find命令详解

一、Find命令简介 Ubuntu的Find命令是一种常用的终端指令,用于在文件系统中查找符合条件的文件和目录。该命令的语法格式如下: find [PATH] [OPTION] [EXPRESSION]其中,PATH表示待查找的目录,OPTION为选项参数,EXPRES…

【JavaSE】初步认识类和对象

【本节目标】 1. 掌握类的定义方式以及对象的实例化 2. 掌握类中的成员变量和成员方法的使用 3. 掌握对象的整个初始化过程 目录 1. 面向对象的初步认知 2. 类定义和使用 3. 类的实例化 4. this引用 1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语…

Excel如何把两列互换

第一步:选择一列 打开excel,选中一列后将鼠标放在列后,让箭头变成十字方向。 第二步:选择Shift键 按住键盘上的Shift键,将列往后移动变成图示样。 第三步:选择互换 完成上述操作后,松开鼠标两…

Vue页面分享QQ\QQ空间\微博\微信

1、封装js代码:share.js文件 // share.js // url - 需要分享的页面地址(当前页面地址) // title - 分享的标题(文章标题)// QQ空间 export function toQQzone(url, title) {url encodeURIComponent(url)title encod…

层叠上下文

一、层叠上下文 在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴,层叠上下文即元素在某个层级上z轴方向的排列关系。假定用户正面向(浏览器)视窗或网页,…

面试热题(打家窃舍)

一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负…

JSON动态生成表格

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>var fromjava"{\"total\":3,\"students\":[{\"name\":\"张三\",\&q…

机器学习基础08-模型选择02-分类算法矩阵(基于Pima 数据集)

算法评估矩阵&#xff08;Algorithm Evaluation Metrics&#xff09;用于评估机器学习算法在特定任务上的性能。不同的任务可能会使用不同的评估矩阵&#xff0c;因为每个任务的优劣衡量标准都不同。 分类算法矩阵 分类问题或许是最常见的机器学习问题&#xff0c;并且有多种评…

java通过http网络url下载文件

Testpublic void test3() throws ParseException {String fileUrl "http://*****/123.pdf";String savePath "C:\\Users\\HHH\\Desktop\\文件\\123.pdf";try {URL url new URL(fileUrl);InputStream inputStream url.openStream();Path outputPath Pa…

Android Studio 报错:Failed to create Jar file xxxxx.jar

通过分析&#xff0c;新下载的项目没有project/gradle目录&#xff0c;故通过其他项目复制到当前项目&#xff0c;就解决了该问题。 同时也出现了新的问题 Unable to start the daemon process.The project uses Gradle 4.1 which is incompatible with Java 11 or newer.原因…

Linux中的firewall-cmd

2023年8月4日&#xff0c;周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务&#xff1f;为什么会有服务&#xff1f;打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones&#xff0…

搭建Django+pyhon+vue自动化测试平台

Django安装 使用管理员身份运行pycharm使用local 1 pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 检查django是否安装成功 1 python -m django --version 创建项目 1 1 django-admin startproject test cd 切换至创建的项目中启动django项目…

bash测试test详解

bash测试test详解 概述 任何相对完整的计算机语言都能够测试某个条件&#xff0c;然后根据测试的结果采取不同的动作。对于测试条件&#xff0c; Bash使用test命令、各种方括号和圆括号、if/then结构等来测试条件。 7.1. Test Constructs 一个if/then语句结构测试一个或多个命…

Swish - Mac 触控板手势窗口管理工具[macOS]

Swish for Mac是一款Mac触控板增强工具&#xff0c;借助直观的两指轻扫&#xff0c;捏合&#xff0c;轻击和按住手势&#xff0c;就可以从触控板上控制窗口和应用程序。 Swish for Mac又不仅仅只是一个窗口管理器&#xff0c;Swish具有28个易于使用的标题栏&#xff0c;停靠栏…

PHP Thinkphp5.0实现抖音团购券码核销

上一篇文章我们说到项目里需要用到美团API接口来实现卡券核销的功能。 那么这篇文章就讲一下&#xff0c;如何实现抖音团购券码的核销功能。 近期项目需要&#xff0c;抖音团购的券码核销&#xff0c;话不多说&#xff0c;直接上代码吧&#xff01; 凑合着用吧&#xff0c;反正…