租网站服务器价格,宿迁网站建设sq918,单页面视频网站,桃园街网站建设ByteBuffer有两种一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面#xff0c;直接由Java虚拟机负责垃圾回收#xff0c;一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况。 JVM堆内存大… ByteBuffer有两种一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面直接由Java虚拟机负责垃圾回收一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况。 JVM堆内存大小可以通过-Xmx来设置同样的direct ByteBuffer可以通过-XX:MaxDirectMemorySize来设置此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后即触发Full GC。注意该值是有上限的默认是64M最大为sun.misc.VM.maxDirectMemory()在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。 Testpublic void testBits() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
// System.out.println(maxMemoryValue:sun.misc.VM.maxDirectMemory()); ByteBuffer bufferByteBuffer.allocateDirect(0);Class c Class.forName(java.nio.Bits); Field maxMemory c.getDeclaredField(maxMemory); maxMemory.setAccessible(true); synchronized (c) { Long maxMemoryValue (Long)maxMemory.get(null); System.out.println(maxMemoryValue:maxMemoryValue); } } 下面要谈到垃圾回收机制direct ByteBuffer通过full gc来回收内存的direct ByteBuffer会自己检测情况而调用system.gc()但是如果参数中使用了DisableExplicitGC那么就无法回收该快内存了-XX:DisableExplicitGC标志自动将System.gc()调用转换成一个空操作就是应用中调用System.gc()会变成一个空操作。那么如果设置了就需要我们手动来回收内存了 Testpublic void testAllocateDirector() throws Exception{ByteBuffer bufferByteBuffer.allocateDirect(1024);Field cleanerField buffer.getClass().getDeclaredField(cleaner);cleanerField.setAccessible(true);Cleaner cleaner (Cleaner) cleanerField.get(buffer);cleaner.clean();} 那么除了FULL GC还有别的能回收direct ByteBuffer吗CMS GC会回收Direct ByteBuffer的内存,CMS主要是针对old space空间的垃圾回收。但是是Oracle JDK 6u32以后的版本 讲了这么多谈下使用场景 1:多用网络编程中用到实现zero copy,数据不需要再native memory和jvm memory中来回copy 2:由于造和析构Direct Buffer时间成本高建议使用缓冲池参见netty的实现转载于:https://www.cnblogs.com/gaoxing/p/4302088.html