堆外内存概要

DirectByteBuffer

JDK中使用 DirectByteBuffer对象来表示堆外内存,每个 DirectByteBuffer对象在初始化时,都会创建一个对应的 Cleaner对象,这个 Cleaner对象会在合适的时候执行 unsafe.freeMemory(address),从而回收这块堆外内存。

当初始化一块堆外内存时,对象的引用关系如下: Cleaner对象在初始化时会被添加到 Clener链表中,ReferenceQueue是用来保存需要回收的 Cleaner对象。

如果该 DirectByteBuffer对象在一次GC中被回收了 此时,只有 Cleaner对象唯一保存了堆外内存的数据(开始地址、大小和容量),在下一次FGC时,把该 Cleaner对象放入到 ReferenceQueue中,并触发 clean方法。

Cleaner对象的 clean方法主要有两个作用: 1、把自身从 Clener链表删除,从而在下次GC时能够被回收 2、释放堆外内存

如果JVM一直没有执行FGC的话,无效的 Cleaner对象就无法放入到ReferenceQueue中,从而堆外内存也一直得不到释放,内存岂不是会爆?

其实在初始化 DirectByteBuffer对象时,如果当前堆外内存的条件很苛刻时,会主动调用 System.gc()强制执行FGC。

不过很多线上环境的JVM参数有 -XX:+DisableExplicitGC,导致了 System.gc()等于一个空函数,根本不会触发FGC,这一点在使用Netty框架时需要注意是否会出问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JMCui

Redis学习一(基础入门).

一、前言     Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key-Value 的数据库、并提供多...

3855
来自专栏用户2442861的专栏

《Java虚拟机原理图解》 1.1、class文件基本组织结构

http://blog.csdn.net/luanlouis/article/details/39892027

912
来自专栏IMWeb前端团队

Promise接口实现之jQuery 的deferred对象

本文作者:IMWeb json 原文出处:IMWeb社区 未经同意,禁止转载 Promise是什么? 我们知道JavaScript是单线程,如果遇到某...

18410
来自专栏偏前端工程师的驿站

Java魔法堂:类加载机制入了个门

一、前言                                 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序...

2037
来自专栏武培轩的专栏

Runtime源码解析(JDK1.8)

package java.lang; import sun.reflect.CallerSensitive; import sun.reflect.Refle...

3599
来自专栏钟绍威的专栏

当struts遇上json,没爱了两种struts自带的domain model方法用json传输数据到后台时,不能用domain model

用过struts的人,或者用过spring MVC的人,都知道domain model接受参数是多么的方便,而且又有依赖注入,简直是自动拿参数,再自动帮你转成j...

1858
来自专栏WindCoder

logstash6配置语法中的条件判断

有时您只想在特定条件下过滤或输出事件。为此,您可以使用条件(conditional)。比如在elk系统中想要添加一个type类型的关键字来根据不同的条件赋值,最...

1.2K1
来自专栏Java技术分享圈

杨老师课堂之JavaSe 部分面试题

​ JVM 是 JavaVirtual Machine 的缩写,全称是 Java 虚拟机。Java 语言的一个非常重要的 特性就是跨平台性,而 Java 虚...

893
来自专栏不止是前端

深入Node

36013
来自专栏zhisheng

Windows 64位下安装Redis超详细教程

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(...

38212

扫码关注云+社区

领取腾讯云代金券