java堆外内存

2/22/2017来源:ASP.NET技巧人气:399

简介

谁在使用堆外内存:线程栈,应用程序代码,NIO缓存 什么东西需要池化,昂贵的对象:线程,数据库连接池, socket。

好处: 理论上能减少GC时间, 提高效率

JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。 JDK7开始,DirectByteBuffer分配内存时默认已不做分页对齐,不会再每次分配并清零 实际需要+分页大小(4k)的内存,这对性能应有较大提升,所以Oracle专门写在了 Enhancements in java I/O 里。

基于GC的回收回收

存在于堆内的DirectByteBuffer对象很小,只存着基地址和大小等几个属性,和一个Cleaner,但它代表着后面所分配的一大段内存,是所谓的冰山对象。通过前面说的Cleaner,堆内的DirectByteBuffer对象被GC时,它背后的堆外内存也会被回收。

http://ju.outofmemory.cn/entry/200574