java NIO包是通过sun.misc.Cleaner和PhantomReference来实现堆外内存的自动释放的。现在来学习下Cleaner的使用
sun.misc.Cleaner是JDK内部提供的用来释放堆外内存的API
package com.cq.myproject.cleaner; import java.lang.reflect.Field; import sun.misc.Unsafe; public class FreeMemoryTask implements Runnable { private long address; public FreeMemoryTask(long address) { this.address = address; } public void run() { System.out.println("running freeMemoryTask"); if(address == 0) { System.out.println("already released"); } else { getUnsafeInstance().freeMemory(address); System.out.println("released"); } } public static Unsafe getUnsafeInstance() { try { Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafeInstance.setAccessible(true); return (Unsafe) theUnsafeInstance.get(Unsafe.class); } catch (Exception e) { return null; } } }
这个实现Runnable接口的类,功能就是释放堆外内存。这是我们必须要做的是,JVM没办法帮我们做(这里的Unsafe对象要手动import)
package com.cq.myproject.cleaner; import sun.misc.Cleaner; public class ObjectInHeapUseCleaner { private static long address = 0; public ObjectInHeapUseCleaner(){ address = FreeMemoryTask.getUnsafeInstance().allocateMemory(2*1024*1024); } public static void main(String[] args) { while(true) { System.gc(); ObjectInHeapUseCleaner heap = new ObjectInHeapUseCleaner(); Cleaner.create(heap,new FreeMemoryTask(address)); } } }
运行这段代码,程序正常运行不会出现OOM(看任务管理器内存使用率不动,cpu使用率跳高)
Cleaner.create()需要两个参数:需要监控的内存对象和程序释放资源的回调。当JVM进行GC时,如果发现我们监控的对象,不存在强引用(Cleaner对象对他的引用是幽灵引用),就会调用第二个参数的run()方法逻辑,执行完run()方法时(此时已经释放了堆外内存),JVM会自动释放堆内存中我们监控的对象
相关推荐
cleakka, 在 sun.misc.Cleaner 和Akka上,集群内存缓存基于 Cleakka ( 清洗器 Akka ):是基于 sun.misc.Cleaner 和Akka的内存缓存使用JVM直接内存将缓存数据存储在堆内存中;这将减少GC延迟如果缓存条目被删除,则...
最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...
sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...
在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...
`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...
标题 "sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;" 暗示了我们正在讨论Java中用于Base64编码和解码的类。这两个类,`BASE64Decoder`和`BASE64Encoder`,是Java早期版本中的非标准组件,属于`sun.misc`...
sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: Access restriction: The type BASE64Decoder is not ...
在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...
sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar
java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载
Intellij-解决报错:import sun.misc.BASE64Decoder无法找到 报错原因:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 sun.misc.BASE64Decoder
Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的,例如Base64 和 Base64URL等需要依赖它
在Java编程语言中,`sun.misc.BASE64Decoder`是一个内置的类,它主要用于将Base64编码的数据解码为原始字节。Base64是一种常见的数据编码方式,尤其在网络传输或者存储二进制数据时,因为许多文本格式(如JSON、XML...
sun.misc.BASE64Encoder找不到jar包,就导入sun.misc.BASE64Decoder.jar 封装好的jar包,无需再导入jre系统库了
如名,就是java 的sun.misc.BASE64Decoder.jar 包。 其实是已经过时的东西,因为java8推出了新的库来替代它,且android也有内置的base64相关的工具库。 但是,总有一些工程是要用老库的,也没办法(懒或者烦)更新...
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
《深入解析Java 7中的sun.misc.BASE64Decoder》 在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的...
在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...