堆外内存

堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。那么堆外内存就是存在于JVM管控之外的一块内存区域,因此它是不受JVM的管控。

java.nio.DirectByteBuffer是Java用于实现堆外内存的一个重要类,我们可以通过该类实现堆外内存的创建、使用和销毁。

DirectByteBuffer该类本身还是位于Java内存模型的堆中。堆内内存是JVM可以直接管控、操纵。
而DirectByteBuffer中的unsafe.allocateMemory(size);是个一个native方法,这个方法分配的是堆外内存,通过C的malloc来进行分配的。分配的内存是系统本地的内存,并不在Java的内存中,也不属于JVM管控范围,所以在DirectByteBuffer一定会存在某种方式来操纵堆外内存。
在DirectByteBuffer的父类Buffer中有个address属性:

// Used only by direct buffers
// NOTE: hoisted here for speed in JNI GetDirectBufferAddress
long address;

address只会被直接缓存给使用到。之所以将address属性升级放在Buffer中,是为了在JNI调用GetDirectBufferAddress时提升它调用的速率。
address表示分配的堆外内存的地址。

 // Primary constructorDirectByteBuffer(int cap) {                   // package-privatesuper(-1, 0, cap, cap);boolean pa = VM.isDirectMemoryPageAligned();int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));Bits.reserveMemory(size, cap);long base = 0;try {base = unsafe.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}unsafe.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {// Round up to page boundaryaddress = base + ps - (base & (ps - 1));} else {address = base;}cleaner = Cleaner.create(this, new Deallocator(base, size, cap));att = null;}

unsafe.allocateMemory(size);分配完堆外内存后就会返回分配的堆外内存基地址,并将这个地址赋值给了address属性。这样我们后面通过JNI对这个堆外内存操作时都是通过这个address来实现的了。

java.nio.DirectByteBuffer管理堆外内存相关推荐

  1. jvm性能调优实战 -54Jetty NIO机制导致堆外内存溢出Direct buffer memory OOM

    文章目录 Pre 案例 故障分析 关于解决OOM问题的底层技术修为的一点建议 堆外内存是如何申请的,又是如何释放的? 为什么会出现堆外内存溢出的情况? 真正的堆外内存溢出原因分析 Java NIO有这 ...

  2. 95-290-050-源码-内存管理-堆外内存与堆内内存概述

    2.概述 ​ Flink的内存管理器管理着用于排序.散列和缓存所需的内存.内存以相等大小的(Segments)表示,称为内存页.操作器通过请求多个内存页来分配内存.在Flink中,内存又分为堆内存和非 ...

  3. NIO详解(六):Java堆外内存

    1. 前言 最近研究ByteBuffer和DirectByteBuffer.堆外内存是相对于堆内内存的一个概念.堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存 ...

  4. Java堆外内存泄露分析

    查看堆内存占用正常,jvm垃圾回收也没有异常.而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏. 需要安装google-perftools工具进行分析 1.先安装g++ 不然编译 ...

  5. 堆外内存与堆内内存详解

    堆外内存一直是Java业务开发人员难以企及的隐藏领域,究竟他是干什么的,以及如何更好的使用呢?那就请跟着我进入这个世界吧. 一.什么是堆外内存 1.堆内内存(on-heap memory)回顾 堆外内 ...

  6. 堆外内存的介绍及释放

    热爱美好的事物,是一种追求 介绍 ____堆外内存意味着把内存对象分配在 Java 虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机), 作用:能缩短垃圾回收时间 ​ 适合生命期中等或较 ...

  7. 堆外内存及其在 RxCache 中的使用

    RxCache RxCache 是一款支持 Java 和 Android 的 Local Cache .目前,支持堆内存.堆外内存(off-heap memory).磁盘缓存. github地址:gi ...

  8. java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  9. java nio 堆外内存_Java堆外内存之突破JVM枷锁

    对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...

最新文章

  1. SAP 企业管理软件与解决方案 产品简介
  2. 编程菜鸟的日记-初学尝试编程-寻找2到n之间的素数并输出
  3. Windows核心编程 第十八章 堆栈
  4. BP算法和RNN_模型CNN-RNN-LSTM和GRU简介
  5. 【李宏毅2020 ML/DL】P1 introduction
  6. LINUX之samba服务器的安装与配置(基于redhat 6.3发行版)
  7. Git for Windows安装和基本设置
  8. Atitit tomcat在linux服务器的启动与其他
  9. OpenXR+Runtime:OpenXR SDK Source Code源码编译
  10. C语言字符串输出中文乱码
  11. chrome 插件tempermonkey
  12. cesium加载entity图片缩放_教你使用最简单粗暴的js方法实现图片最小边展示
  13. linux nano编译器_Nano 编辑器可以做些什么?
  14. vue实现图片轮播二
  15. mysql 创建存储过程语法_mysql存储过程语法及实例
  16. strcpy 和strncpy 的代码和区别
  17. 信息系统项目管理10大管理
  18. 文本文件的加密与解密
  19. 简易支付验证:即时支付、签名的有效性和交易的完整性
  20. kali linux中goldendict查词慢的问题

热门文章

  1. Django+xadmin 打造线上教育平台(二)-1(旧)
  2. Android Weekly Notes Issue #230
  3. Educational Codeforces Round 1(D. Igor In the Museum) (BFS+离线访问)
  4. 20140704笔试面试总结(java)
  5. 网络游戏同步问题综述
  6. .NET 程序员十种常用辅助开发工具
  7. 中移动将整合手机邮箱和飞信业务
  8. Node.js -- 目录
  9. 2019年的一个小目标,成为csdn的博客专家,纪念一下
  10. 矩阵特征值的物理意义