Riven is right, BufferUtils.createByteBuffer(int) does the same thing than ByteBuffer.allocateDirect() except that it sets its byte order to the native one of the platform. It probably does :
What do you mean? An undirected NIO buffer is allocated on the Java heap but a direct NIO buffer is allocated on the native heap. The former doesn’t need any intervention of the programmer to be garbage collected whereas the latter may require some help, for example when you still have a lot of memory available in the Java heap but not in the native heap.
Follow Riven’s suggestion and if the JVM needs a kick in its ass, get the cleaner of your direct NIO buffer and call it but you must be absolutely sure that the VBO using it has been destroyed before.