`

sun.misc.Cleaner

 
阅读更多

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上,集群内存缓存基于.zip

    cleakka, 在 sun.misc.Cleaner 和Akka上,集群内存缓存基于 Cleakka ( 清洗器 Akka ):是基于 sun.misc.Cleaner 和Akka的内存缓存使用JVM直接内存将缓存数据存储在堆内存中;这将减少GC延迟如果缓存条目被删除,则...

    sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用已解决

    最近项目实验发现导入工具程序后项目有错,查看发现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.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    sun.misc.BASE64Encoder源码及jar包

    在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...

    sun.misc.BASE64Encoder.jar包

    `sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...

    sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;

    标题 "sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;" 暗示了我们正在讨论Java中用于Base64编码和解码的类。这两个类,`BASE64Decoder`和`BASE64Encoder`,是Java早期版本中的非标准组件,属于`sun.misc`...

    sun.misc.base64decoder.jar下载

    sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:  Access restriction: The type BASE64Decoder is not ...

    sun.misc.BASE64Encoder 加密源码+完整包.rar

    在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 sun.misc.BASE64Decoder.jar

    java开发 sun.misc.BASE64Decoder.jar包下载

    java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载

    sun.misc.BASE64Decoder.rar

    Intellij-解决报错:import sun.misc.BASE64Decoder无法找到 报错原因:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 sun.misc.BASE64Decoder

    sun.misc.jar

    Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的,例如Base64 和 Base64URL等需要依赖它

    sun.misc.BASE64Decoder

    在Java编程语言中,`sun.misc.BASE64Decoder`是一个内置的类,它主要用于将Base64编码的数据解码为原始字节。Base64是一种常见的数据编码方式,尤其在网络传输或者存储二进制数据时,因为许多文本格式(如JSON、XML...

    sun.misc.BASE64Encoder.jar

    sun.misc.BASE64Encoder找不到jar包,就导入sun.misc.BASE64Decoder.jar 封装好的jar包,无需再导入jre系统库了

    sun.misc.BASE64Decoder.jar

    如名,就是java 的sun.misc.BASE64Decoder.jar 包。 其实是已经过时的东西,因为java8推出了新的库来替代它,且android也有内置的base64相关的工具库。 但是,总有一些工程是要用老库的,也没办法(懒或者烦)更新...

    JDK8中sun.misc包下的UnSafe类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    sun.misc.BASE64Decoder.zip

    《深入解析Java 7中的sun.misc.BASE64Decoder》 在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的...

    sun.misc.BASE64Encoder 找不到

    在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...

Global site tag (gtag.js) - Google Analytics