Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM之直接内存

JVM之直接内存

作者头像
Java微观世界
发布于 2025-01-20 13:54:23
发布于 2025-01-20 13:54:23
12500
代码可运行
举报
文章被收录于专栏:springbootspringboot
运行总次数:0
代码可运行

1、直接内存概述

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

代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  IO                  NIO (New IO / Non-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);
        System.out.println("直接内存分配完毕,请求指示!");

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

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

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

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

2、BIO 与 NIO

非直接缓存区(BIO)

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

直接缓冲区(NIO)

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

3、直接内存与 OOM

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

代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 本地内存的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 {
            System.out.println(count);
        }
    }
}

执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
180
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
	at 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.atguigu.java.BufferTest2.main(BufferTest2.java:21)

Process finished with exit code 1

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

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

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM-直接内存(Direct Memory)
直接内存是Java堆之外的,直接向系统申请的内存空间,所以直接内存不是虚拟机的一部分,也不是《Java虚拟机规范》中定义的内存区域,也有可能导致OOM。
逍遥壮士
2021/07/05
1.7K0
JVM-直接内存(Direct Memory)
关于JVM直接内存触发Full GC
今天在研究JVM的直接内存溢出时发现直接内存和堆内存一样,在直接内存快满时会触发full gc,full gc会将未被引用的对象及其指向的直接内存释放掉,如下为测试代码: package test.oom; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; /**  * VM args: -XX:+PrintGCDetails -XX:MaxDirectMemorySize=500M  * @au
囚兔
2018/02/08
2.7K0
JVM内存与垃圾回收篇第11章直接内存
第 11 章 直接内存 1、直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 代码示例 代码 /** * IO
yuanshuai
2022/08/17
5230
JVM内存与垃圾回收篇第11章直接内存
Thrift抛直接内存OOM一点解决思路
最近使用Thrift TThreadedSelectorServer服务方式,运行一段时间就会抛OutOfMemoryError: Direct buffer memory异常; java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:658) ~[na:1.7.0_67] at java.nio.DirectByteBuffer.<init>(Dire
囚兔
2018/02/08
1.6K0
JVM创建对象之内存解析
加载类元信息 -》 为对象分配内存 -》处理并发问题 -》属性的默认初始化 -》设置对象头 -》init方法
程序员阿杜
2021/07/05
5210
JVM创建对象之内存解析
直接内存满了导致的OOM
OOM导致的溢出比较容易复现,并且很容易排查,在日常开发过程中要注意,不用的变量或引用要及时回收。
逍遥壮士
2021/07/29
1.5K0
聊聊netty的maxDirectMemory
本文主要研究一下netty的maxDirectMemory(io.netty.maxDirectMemory)
code4it
2019/04/02
1.3K0
聊聊netty的maxDirectMemory
常识四堆外内存
堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容
码农戏码
2021/03/23
2.8K0
【JVM调优实战100例】05——方法区调优实战(下)
直接内存由操作系统来管理。常见于NIO,用于数据缓冲,读写性能很高,分配回收花销较高。
半旧518
2022/10/26
4930
【JVM调优实战100例】05——方法区调优实战(下)
聊聊jvm的-XX:MaxDirectMemorySize
序 本文主要研究一下jvm的-XX:MaxDirectMemorySize jpoutisfj_03.png -XX:MaxDirectMemorySize -XX:MaxDirectMemorySize=size用于设置New I/O(java.nio) direct-buffer allocations的最大大小,size的单位可以使用k/K、m/M、g/G;如果没有设置该参数则默认值为0,意味着JVM自己自动给NIO direct-buffer allocations选择最大大小 System.i
code4it
2019/03/28
13.5K0
聊聊jvm的-XX:MaxDirectMemorySize
Java程序员必备:常见OOM异常分析
放假这几天,温习了深入理解Java虚拟机的第二章, 整理了JVM发生OOM异常的几种情况,并分析原因以及解决方案,希望对大家有帮助。
捡田螺的小男孩
2020/04/14
1.4K0
JAVA面试50讲之10:直接(堆外)内存原理及使用
HeapByteBuffer是堆内ByteBuffer,使用byte[]存储数据,是对数组的封装,比较简单。DirectByteBuffer是堆外ByteBuffer,直接使用堆外内存空间存储数据,是NIO高性能的核心设计之一。本文来分析一下DirectByteBuffer的实现。
用户1205080
2019/01/23
3K1
JVM内存模型之直接内存
直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。
shengjk1
2018/10/24
7240
作为 Java 开发者,你需要了解的堆外内存知识
本文来自作者 应书澜 在 GitChat 上分享 「深入解读 Java 堆外内存(直接内存)」
CSDN技术头条
2018/07/30
1.2K0
作为 Java 开发者,你需要了解的堆外内存知识
JVM-直接内存
JVM 直接内存(Direct Memory)是 JVM 运行时使用的一种特殊内存区域,它是 JVM 堆外的一块内存空间。在 Java 中,我们使用java.nio 包和java.lang.System类中的arraycopy()方法等来操作直接内存。
程序员朱永胜
2023/11/11
6441
JVM-直接内存
一文探讨堆外内存的监控与回收
记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可以说相当简单,但根据监控却发现堆外内存飙升,导致了 OutOfMemeory 的异常。
kirito-moe
2019/04/30
1.3K0
一文探讨堆外内存的监控与回收
常见的 OOM 异常分析(硬核干货)
在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。
Java3y
2020/07/09
2K0
常见的 OOM 异常分析(硬核干货)
程序员进阶系列:OOM 都搞不定,还敢妄称自己Java高级攻城狮?
正式开讲之前,先罗列一下所知的 OutOfMemoryError (简称 OOM)异常,看看这些异常工作中你是否也遇到过?
一猿小讲
2020/11/03
5770
工作中最常见的6种OOM问题
最近我写的几篇线上问题相关的文章:《糟糕,CPU100%了》《如何防止被恶意刷接口》《我调用第三方接口遇到的13大坑》,发表之后,在全网广受好评。
苏三说技术
2024/03/18
3000
工作中最常见的6种OOM问题
从0到1起步-跟我进入堆外内存的奇妙世界
堆外内存一直是Java业务开发人员难以企及的隐藏领域,究竟他是干什么的,以及如何更好的使用呢?那就请跟着我进入这个世界吧。
小程故事多
2018/08/22
4690
从0到1起步-跟我进入堆外内存的奇妙世界
相关推荐
JVM-直接内存(Direct Memory)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档