java之堆外内存

我们都知道java有堆内存即Hotspot,堆内存是java语言别与其他语言的优势之一,堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露。程序员不需要像写C++那样考虑什么时候该释放内存,java中,你只管创建对象,回收内存的事情交给GC。
就像人们一直吃着精米细米一段时间后,又惦记着五谷杂粮了。又想自己控制内存的分配,回收了。故而还有一个不常用的堆外内存,弥补这部分的不足。
使用堆外内存,是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。但是,堆外内存几乎是不受GC的管理的,也就是说,需要用户自己调用System.gc()进行内存的释放。
下面是NIO包下ByteBuffer的一个例子:

import java.nio.ByteBuffer;
public class DirectHotspotTest{
	public static void main(String[] args) throws Exception{
		while(true){
		 ByteBuffer buffer = ByteBuffer.allocateDirect(10*1024*1024);//一直开辟堆外内存
		}
	}
}

上面例子我们是让程序一直在开辟堆外内存,可在一台配置不是很高的机器上试验;打开虚拟机监控堆内存,发现堆内存空间非常充足,但是到最后依然会卡死。是因为这个程序使用的是堆内存之外的主机的物理内存,堆外内存不受GC的监控,GC不会对这些内存做Full GC操作,所以最终会撑爆主机的物理内存而卡死。

总结

堆外内存的好处是:

(1)可以扩展至更大的内存空间。比如超过1TB甚至比主存还大的空间;

(2)理论上能减少GC暂停时间;

(3)可以在进程间共享,减少JVM间的对象复制,使得JVM的分割部署更容易实现;

(4)它的持久化存储可以支持快速重启,同时还能够在测试环境中重现生产数据

站在系统设计的角度来看,使用堆外内存可以为你的设计提供更多可能。最重要的提升并不在于性能,而是决定性的

参考:https://www.cnblogs.com/moonandstar08/p/5107648.html

猜你喜欢

转载自blog.csdn.net/zhaoxichen_10/article/details/86239223