简介

项目中采用了java+c的混合开发,通过jni进行了底层结构体的内存分配,将指针返回给java层保存,随后则可以通过传递指针值来操作底层代码。在java中,仍然需要手动释放jni分配出来的内存的。

如何让GC来自动管理jni内存

sun.misc.Cleaner可以做到!
话不多说,直接看例子。

示例

import sun.misc.Cleaner;public class Main {public static class FreeMemoryTask implements Runnable {private long address;public FreeMemoryTask(long address) {this.address = address;}@Overridepublic void run() {// 有地址可以进行回收System.out.println("垃圾回收触发" + address);}}public static class MyObject {public static int a = 0;private long id = 0;private byte[] array;public MyObject() {id = ++a;array = new byte[1024 * 1024 * 10];System.out.println("创建了对象" + id);}public static void main(String[] args) throws Exception {while (true) {//                System.gc();MyObject object = new MyObject();// Cleaner.create 检测对象回收,回收时触发FreeMemoryTaskCleaner.create(object, new FreeMemoryTask(object.id));Thread.sleep(1000);}}}
}

运行效果

创建了对象1
创建了对象2
创建了对象3
创建了对象4
创建了对象5
创建了对象6
创建了对象7
创建了对象8
创建了对象9
创建了对象10
垃圾回收触发1
垃圾回收触发2
垃圾回收触发7
垃圾回收触发6
垃圾回收触发5
垃圾回收触发3
垃圾回收触发4
垃圾回收触发10
垃圾回收触发9
垃圾回收触发8
创建了对象11
创建了对象12
创建了对象13
创建了对象14
创建了对象15
创建了对象16
创建了对象17

说明

在发生GC时,就会触发FreeMemoryTask。只需要将指针地址交给它,就可以进行垃圾回收。

优点

  1. 比finalizer更轻量更好用。
  2. 遇到该对象共享给多个线程,大部分时间只读,少部分时间更新时,释放需要用读写锁确保安全。但采用Cleaner则无需锁,更加高效。

netty中的DirectByteBuffer

通过一系列的源码跟踪,最终会发现,其回收相关的代码如下:

DirectByteBuffer(int cap) {                   // package-private ……Cleaner.create(this, new Deallocator(base, size, cap));……
}private static class Deallocator implements Runnable
{private static Unsafe unsafe = Unsafe.getUnsafe();private long address;private long size;private int capacity;private Deallocator(long address, long size, int capacity) {assert (address != 0);this.address = address;this.size = size;this.capacity = capacity;}public void run() {if (address == 0) {// Paranoiareturn;}unsafe.freeMemory(address);address = 0;Bits.unreserveMemory(size, capacity);}}

从这段源码来看,也就是说,即使忘记手动释放资源,在对象能被GC的情况下,应该也是能够通过正常的GC回收掉堆外内存的,这点暂不确认。

sun.misc.Cleaner实现堆外内存回收相关推荐

  1. sun.misc.Unsafe和堆外内存

    sun.misc.Unsafe类允许您执行许多Java中不应该做的事情,但是在非常特殊的情况下仍然有用. 必须在99%的时间避免这种情况,但是在极少数情况下,这是唯一有意义的解决方案. 这篇文章考虑了 ...

  2. 一文探讨堆外内存的监控与回收

    引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...

  3. haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了

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

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

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

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

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

  6. JVM--Java堆外内存--使用/作用

    原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的堆外内存.包括:堆外内存介绍.创建/回收方法.为什么堆外内存能够提升IO效率. 堆外内存简 ...

  7. jvm堆外内存--DirectByteBuffer

    jvm的堆外内存本来是高贵而神秘的东西,只在一些缓存方案实战级别才会出现.但自从用了Netty等高并发IO框架后,就变成了天天与堆外内存打交道,在mina,netty等nio框架中屡见不鲜.堆外内存的 ...

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

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

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

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

最新文章

  1. csdn,我真的来了。
  2. python邮件发送哪个好_python发邮件(一)
  3. 【机器学习】 - keras学习 - 图片生成器ImageDataGenerator
  4. 架构设计 例子和实践
  5. Entityframework批量删除
  6. 实施文档_建设工程监理全套资料范本,Word文档附百份案例表格,超实用
  7. STM32----摸石头过河系列(八)
  8. python命令行运行django项目, can‘t open file ‘manage.py‘ 问题解决
  9. linux文件构成,Linux文件结构及管理(1)
  10. 【快代理】隧道代理使用教程
  11. 「 数学模型 」“灰色模型的研究步骤及五步建模思想”讲解
  12. 解决microsoft store需要联网 你似乎没有联网
  13. 【报名开启】2021年博客之星总评选,属于你的年终表彰
  14. java跨域问题Response to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Or
  15. 视频教程-Java高级技术-Java
  16. matlab求系统根轨迹代码_怎么学习经典控制(结合MATLAB)
  17. 泛泛而谈的菜鸟学习记录(六)—— 贴花
  18. laravel配置语言包,实现网站中英文切换
  19. CCL: Cross-modal Correlation Learning With Multigrained Fusion by Hierarchical Network 论文笔记
  20. nexus3仓库搭建

热门文章

  1. python爬虫----简单的抓取斗鱼弹幕
  2. FofaMap云查询版
  3. Exception in thread “main“ java.lang.Error: Unresolved compilation problem: at second.math_practi
  4. 基于水平投影,垂直投影的字符图像分割思路和代码实现
  5. GPS/BD陶瓷天线
  6. MT5交易软件使用技巧
  7. Sqlite3安装使用(基于Windows 10)
  8. 立冬了,小伙伴们要注意保暖哦!
  9. 微信多群直播机器人平台(一起学堂)
  10. 手机互动网页项目总结(转)