原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Java的堆外内存。包括:堆外内存介绍、创建/回收方法、为什么堆外内存能够提升IO效率。

堆外内存简介

JVM启动时分配的内存,称为堆内存。代码中还可使用堆外内存。Memcached等等很多缓存框架都会使用堆外内存,Netty、Mina等框架提供的接口也是基于ByteBuffer封装的

堆外内存优点

提升了IO效率(减少了从堆内到堆外的数据拷贝);减小了GC压力(不参与GC,有特定的回收机制);

堆外内存缺点

分配和回收堆外内存比较耗时(解决方案:通过对象池避免频繁地创建和销毁堆外内存);

创建/回收方法

创建

ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);

底层通过unsafe.allocateMemory(size)实现

设置 

可指定JVM参数来确定堆外内存大小限制: -XX:MaxDirectMemorySize=512m  (JVM默认64M,JRocket默认无限)。对于这种direct buffer,内存不够的时候会抛出错误: java.lang.OutOfMemoryError: Direct buffer memory

堆外内存回收

方法1:cleaner().clean()

((DirectBuffer)byteBuffer).cleaner().clean();

内部还是调用System.gc()。所以一定不要-XX:+DisableExplicitGC

方法2:调用System.gc进行full gc。

堆外内存并不直接控制于JVM,因此只能等到full GC的时候才能垃圾回收!(direct buffer归属的的JAVA对象是在堆上且能够被GC回收的,一旦它被回收,JVM将释放direct buffer的堆外空间。前提是没有关闭DisableExplicitGC)

为什么堆外内存能够提升IO效率?

因为从堆内向磁盘/网卡读写数据时,数据会被先复制到堆外内存,然后堆外内存的数据被拷贝到硬件,如下图所示,直接写入堆外内存可避免堆内到堆外的一次数据拷贝

其他网址

Java堆外内存:堆外内存回收方法_java_hellozhxy的博客-CSDN博客

JVM--Java堆外内存--使用/作用相关推荐

  1. Java堆外内存泄露分析

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

  2. java堆外内存泄漏分析排查

    JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1.前言 2.准备 3.具体分析 3.1堆外溢出风险判断 3.1.1确认java进程号 3.1.2查看此java进程的jvm参数 3.1.3查看j ...

  3. Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  4. 记一次Cassandra Java堆外内存排查经历

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  5. java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  6. Java堆外内存:堆外内存回收方法

    一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...

  7. java堆外内存详解(又名直接内存)和ByteBuffer

    堆内内存 java的内存分为堆内内存和堆外内存,在了解堆外内存之前,先看看堆内内存是啥,堆内内存是受jvm管控的,也就是说,堆内内存由jvm负责创建和回收:创建和回收都是自动进行的,不需要人为干预: ...

  8. java堆外内存6_Java堆外内存排查小结

    简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路.之前的文章排版太乱,现在整理重发一下,内容是一样的. 通过本文,你应该了解: pmap 命令 gdb 命令 per ...

  9. Java堆外内存:堆外内存溢出问题排查

    一.堆外内存组成 通常JVM的参数我们会配置 -Xms 堆初始内存  -Xmx 堆最大内存  -XX:+UseG1GC/CMS 垃圾回收器  -XX:+DisableExplicitGC 禁止显示GC ...

最新文章

  1. 基于OpenCV的条形码区域分割
  2. 3位格雷码的顺序编码_FPGA 设计之 跨时钟域(四 - 格雷码)
  3. 机器学习者应知的五大深度学习框架
  4. JSON字符串转换object错误:MorphDynaBean cannot be cast to com.softright.bean.TestBean,类中有集合类型的属性...
  5. mysqld已删除但仍占用空间的_Windows 10删除备份文件方法
  6. 程序员因拒绝带电脑回家工作被开除!获赔19.4万元
  7. python 量化交易_基于Python的量化交易工具清单(上)
  8. 3.3栈与递归的实现
  9. Python3 协程 + 正则 批量爬取斗鱼美女图片
  10. ai的预览模式切换_深耕基础办公领域,永中软件云端远程办公新模式助力企业复工复产...
  11. java集合详解_「软帝学院」Java进阶者专栏:集合框架详解3
  12. 运行elasticsearch时报错:could not find java; set JAVA_HOME or ensure java is in PATH
  13. python set dict tuple and list
  14. GRACE数据介绍及下载
  15. Python修改Word文件设置所有图片都居中对齐
  16. 世界在变化刷脸支付一直奋进
  17. Linux下自动重启系统
  18. 什么是3D摄影机,与普通摄影机有什么不同?
  19. js对文件和二进制操作的一些方法汇总
  20. python脚本模式_python脚本怎么执行

热门文章

  1. 同事之间都有哪些潜规则?
  2. java 汉字转换全拼、首字母拼音
  3. 【笔记】理解黑天鹅,应对不可预知的未来
  4. 【机器人小游戏---html(附源代码)】
  5. java8 合并两个list日期相同为一条
  6. oracle创建序列号
  7. 聊一聊 AS 的一些好用的功能
  8. mysql nan_在MySQL数据库中插入NaN值
  9. Linux下使用AppImageLauncher安装AppImage文件
  10. 查询7日内的展示数据