JVM直接内存

1.直接内存(Direct Memory)概述

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

2.直接内存为什么性能高

如下图,不用直接内存的时候,读取磁盘文件需要先经过系统内存缓存,然后再经过java堆内存缓存编译之后才可以使用
使用直接内存之后,java堆内存和系统内存就变成了直连,直通的java可以直接读磁盘文件

在这里插入图片描述

3.分配和回收的原理

直接内存不受JVM内存回收管理
使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
ByteBufier 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦 BvteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存

4.禁用显示回收对直接内存的影响

-XX:+DisableExplicitGC 禁用显示的GC
例如:System.gc();就是显示的垃圾回收,Full GC
System.gc()是一种Full GC 是一种比较影响性能的垃圾回收,不仅要回收新生代,还要回收老年代

如果去去掉了这个虚拟机参数的设置,但是有情况可能有些别的代码,显示的调用System.gc,也会导致垃圾回收,垃圾回收对性能产生影响,可以用到,我们不用java的垃圾回收,可以使用unsafe对象直接调用freeMemory()的方式,来释放直接内存,这是手动的管理直接内存

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值