| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JVM -- 直接内存 -> 正文阅读 |
|
[Java知识库]JVM -- 直接内存 |
传统的阻塞IO 使用直接内存 ?观看耗时: ?说明直接内存远远快于传统的方式 原理 -- 为什么读写效率变高java本身并不具备磁盘读写的能力,他要使用操作系统的方法,其实就是调用native方法?,会涉及到用户态和内核态的切换,当切换到内核态,就可以由cpu的函数读取磁盘文件的内容,在操作系统内存划分出一块系统缓冲区,磁盘的内容存储到系统缓冲区,但是系统缓冲区Java代码是不能进行操作的,所以java也会在堆内存中分配一个java缓冲区,就是我们new的Byte数组,java要访问到系统缓冲区的数据,就要将系统缓冲区的内容读入到java缓冲区,因为现在有两块缓冲区,数据必然要存两份,造成不必要的浪费,效率不高 ? 当调用ByteBuffer.allocateDirect()方法时,意味着会在操作系统中划分一块缓冲区,但是这块缓冲区不同的是,java系统可以访问到这块内存,那加入直接内存后,磁盘文件读取的时候,直接读取到直接内存,而java代码也可以读取到,少了一次数据的拷贝操作。? 内存溢出既然直接内存不受jvm管理,会不会导致内存溢出呢 ?执行代码,我们发现会有内存的溢出 ?释放原理我们执行程序,发现该程序占用了1G的内存? ? 我们发现置位null之后,内存占用变少,说明回收掉了 分配和回收原理
?禁用System.gc() ==> 显示的进行垃圾回收 触发的是FullGC,即也会回收老年代的垃圾 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:44:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |