Java@java程序员之路——jvm详细解释(7)
文章图片
每天记录一个知识点
1.5 直接内存
- 常见于NIO操作时 , 用于数据缓冲区
- 分配成本比较高 , 读写操作快
- 不受JVM内存回收管理
- 使用前:从下面可以看出java内存中和系统内存中都保存了磁盘文件 。 保存了两份
- 因为java无法操作本地文件 , 在java堆内存中划出java缓冲区;
- 从用户态转移到内核态 , 本地方法在系统内存中划出一段系统缓冲区 , 将磁盘文件分部分缓冲到系统缓冲区中 , 间接的将系统缓冲区中数据传输到java缓冲区中;
- 内核态转到用户态 , 调用输出流写入操作 , 将文件copy到另一个位置 , 循环copy , 直到全部复制完成 。
使用后:
- ByteBuffer.allocateDirect(_size) , 在系统内存中分配直接内存;
- 系统方法和java方法都可以访问直接内存;
- 与不使用直接内存相比 , 减少了一次从系统缓存区向java缓冲区复制的操作 , 复制效率成倍上升
- 疑问:直接内存不受JVM的垃圾回收机制 , 会不会出现内存泄漏那?
答案:会的
- package
- com.example.jvm;importjava.nio.ByteBuffer;
- importjava.util.ArrayList;i
- mportjava.util.List;
- publicclassDemo3{
- publicstaticvoidmain(String[
args){
- List<ByteBuffer>list=newArrayList<>();
- 【Java@java程序员之路——jvm详细解释(7)】inti=0;
- try{
- while(true){
- ByteBuffer byteBuffer=ByteBuffer.allocateDirect(100*1024*1024);
- list.add(byteBuffer);
- i++;
- finally{
- System.out.println(i);
- 363.6GException in thread\"main\"java.lang.OutOfMemoryError:Direct buffer memory\tat java.nio.Bits.reserveMemory(Bits.java:694)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)at com.example.jvm.Demo3.main(Demo3.java:14)
推荐阅读
- 『程序员』装出新高度! 程序员用代码写招租广告只因不想与其它行业人士合租
- #程序员#?8年经验程序员跳槽,2个月面试腾讯百度京东等70家公司,总结出4个共同点
- 程序员■Java程序员必知:HashMap进行put操作会不会引起死循
- 程序员@同学在加拿大当程序员,对比国内程序员的待遇,差距这么大
- #程序员#腾讯T4:结合我多年工作经验给程序员的几点忠告,别再埋头苦干了
- 科技杂志社|系列看一加手机的后壳探索之路,从一加8
- 科技怪人|C++程序员的学习进阶之路之书籍篇
- 「程序员」百度女程序员半夜打的回家,被司机嘲讽:加班到一点收入没我高,值得吗?
- 华为■我,华为程序员,35岁被辞退,年薪百万也躲不过“失业危机”?
- 『程序员』程序员多次劝说邻居,不要让孩子去学编程,结果蒙了