标签:out system set cep 如何 str 队列 span queue
ByteBuffer.allocateDirect()来分配(ByteBuffer.allocate()分配堆内内存),分配的是非Heap(堆外)的内存,不排除操作系统可能把directBuffer交换到磁盘。
DirectBuffer 大体原理就是使用 Java Heap 之外的内存,这些内存不会被通常的 GC 回收,所以就规避了 GC 对应用线程的中断影响,同时也避免了内存拷贝的开销。
当系统应用场景满足:
DirectBuffer 在-XX:MaxDirectMemorySize=xxM 大小限制下, 使用Heap之外的内存, GC对此”无能为力” ,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响.
DirectByteBuffer 类有一个内部的静态类 Deallocator,这个类实现了 Runnable 接口并在 run() 方法内释放了内存:
通过查看Bits的maxMemory和reservedMemory属性来监控使用情况。
package com.jvm.study.part2; import java.lang.reflect.Field; public class CollectDirectMemoryInfo { /** * @VM args:-XX:MaxDirectMemorySize=10m */ public static void main(String[] args) throws NoSuchFieldException, SecurityException, ClassNotFoundException, IllegalArgumentException, IllegalAccessException { //Class c = java.nio.Bits.class; //无法访问 Class c = Class.forName("java.nio.Bits"); Field maxMemory = c.getDeclaredField("maxMemory"); maxMemory.setAccessible(true); Field reservedMemory = c.getDeclaredField("reservedMemory"); reservedMemory.setAccessible(true); synchronized (c) { Long maxMemoryValue = (Long)maxMemory.get(null); Long reservedMemoryValue = (Long)reservedMemory.get(null); System.out.println("maxMemoryValue:"+maxMemoryValue/(1024 * 1024) + "m"); System.out.println("reservedMemoryValue:"+reservedMemoryValue/1024 * 1024 + "m"); } } }
结果:
maxMemoryValue:10m
reservedMemoryValue:0m
5.参考
监控使用的directBuffer大小:http://stackoverflow.com/questions/3908520/looking-up-how-much-direct-buffer-memory-is-available-to-java
《应用DirectBuffer提升系统性能》http://www.tbdata.org/archives/801
《Java 的 DirectBuffer 是什么东西?》http://www.simaliu.com/archives/274.html
标签:out system set cep 如何 str 队列 span queue
原文地址:http://www.cnblogs.com/duanxz/p/6090442.html