直接内存:
直接内存并不是jvm运行时数据区的一部分,但是他也会被频繁地使用,而且可能会报出OOM异常。JDK1.4中加入了NIO(new input/output)类;引入了一种基于通道的(channel)与缓冲区(buffer)的I/O方式,他可以直接使用native方法区分配堆外的内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作,这样可以显著的提高性能,因为比避免了在java堆中和native堆中来回的复制数据。
对象访问:
Object object = new Object();
Object object 将会反映到java栈的本地变量表中,作为一个reference类型数据出现;而new Object(),会被反映到java堆中,形成一块存储了Object类型所有实例数据的结构化内存;不同的虚拟机可能又不一样的实现,因此这块内存长度在不同虚拟机中可能不一样。另外在java堆中还必须包含能够查找到此对象类型数据的地址信息,这些类型数据(如对象类型、父类、实现的接口、方法等)则存储在方法区中。
由于reference类型在jvm规范中只规定了一个指向对象的引用,并没有定义这个引用通过什么方式去定位,以及如何访问到java堆中的对象的具体位置;因此不同虚拟机可能实现不同,有的使用句柄,有的使用直接指针,句柄就是在java堆中有一块内存来作为句柄池,reference引用指向的是句柄地址,句柄指向具体的实例对象,内存回收的时候,如果实例在内存中的位置变化了,那么只需要改变句柄的指向而不需要改变栈中引用的指向;还有就是使用直接指针的回提高不少效率,节省时间,在大规模的对象查找过程中直接指针会节省非常可观的时间。