您现在的位置是:首页 > 编程 > 

JVM之直接内存

2025-07-22 03:27:01
JVM之直接内存 1、直接内存概述 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于IO,通过存在堆中的DirectByteBuffer操作ative内存 通常,访问直接内存的速度会优于Java堆。即读写性能高 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存 Java的I

JVM之直接内存

1、直接内存概述
  1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
  2. 直接内存是在Java堆外的、直接向系统申请的内存区间。
  3. 来源于IO,通过存在堆中的DirectByteBuffer操作ative内存
  4. 通常,访问直接内存的速度会优于Java堆。即读写性能高
  5. 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存
  6. Java的IO库允许Java程序使用直接内存,用于数据缓冲区

代码示例

代码语言:javascript代码运行次数:0运行复制
/**
 *  IO                  IO (ew IO / on-Blocking IO)
 *  byte[] / char[]     Buffer
 *  Stream              Channel
 * 查看直接内存的占用与释放
 */
public class BufferTest {
    private static final int BUFFER = 1024 * 1024 * 1024;//1GB

    public static void main(String[] args){
        //直接分配本地内存空间
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
        println("直接内存分配完毕,请求指示!");

        Scanner scanner = new Scanner(System.in);
        ();

        println("直接内存开始释放!");
        byteBuffer = null;
        System.gc();
        ();
    }
}

直接占用了 1G 的本地内存

释放后,Java程序的内存占用明显减少

2、BIO 与 IO

非直接缓存区(BIO)

采用BIO的架构,在读写本地文件时,我们需要从用户态切换成内核态

直接缓冲区(IO)

IO 直接操作物理磁盘,省去了中间商赚差价

、直接内存与 OOM
  1. 直接内存也可能导致OutofMemoryError异常
  2. 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。
  3. 直接内存的缺点为:   1)分配回收成本较高   2)不受JVM内存回收管理
  4. 直接内存大小可以通过MaxDirectMemorySize设置
  5. 如果不指定,默认与堆的最大值-Xmx参数值一致

代码示例

代码语言:javascript代码运行次数:0运行复制
/**
 * 本地内存的OOM:  OutOfMemoryError: Direct buffer memory
 */
public class BufferTest2 {
    private static final int BUFFER = 1024 * 1024 * 20;//20MB

    public static void main(String[] args) {
        ArrayList<ByteBuffer> list = new ArrayList<>();

        int count = 0;
        try {
            while(true){
                ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
                list.add(byteBuffer);
                count++;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } finally {
            println(count);
        }
    }
}

执行结果:

代码语言:javascript代码运行次数:0运行复制
180
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
	at Bits.reserveMemory(Bits.java:694)
	at DirectByteBuffer.<init>(DirectByteBuffer.java:12)
	at ByteBuffer.allocateDirect(ByteBuffer.java:11)
	at com.atguigu.java.(BufferTest2.java:21)

Process finished with exit code 1

JDK8 中元空间直接使用本地内存

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除程序内存数据虚拟机jvm

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1162800.html

相关标签:无
上传时间: 2025-07-20 20:22:04
留言与评论(共有 9 条评论)
本站网友 广州北部万科城
30分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看程序内存数据虚拟机jvm
本站网友 门头沟西山
14分钟前 发表
访问直接内存的速度会优于Java堆
本站网友 联众记牌器
5分钟前 发表
也不是《Java虚拟机规范》中定义的内存区域
本站网友 天山雪莲的功效与作用
24分钟前 发表
12) at ByteBuffer.allocateDirect(ByteBuffer.java
本站网友 孔维
23分钟前 发表
Java程序的内存占用明显减少2
本站网友 癌症检测
6分钟前 发表
来源于IO
本站网友 金融机构客户身份识别
4分钟前 发表
分享自作者个人站点/博客
本站网友 成都万达电影城
24分钟前 发表
Direct buffer memory at Bits.reserveMemory(Bits.java