最近在读周志明老师所著《深入了解JVM虚拟机。。》一书,在谈到DirectMemory时,我产生了许多疑问,书中只是简单的提了它并不是JVM运行时数据区的一部分,所以我很费解。
因为据我所了解,一个进程运行在操作系统下,比如32位的操作系统,那么它的虚拟内存空间一定是4G,而进程用户空间一般只能用2G,包括JVM进程也是如此。
我带着这个疑问看了许多博客,查了许多资料,未果,只是看好多文章画了一个简单的内存图,标识出一片是堆内,一片是堆外,拜托,这还有画出来吗?谁没这点概念,完全没讲到问题的本质!
在纠结这个问题的时候,我灵光一闪,想到了学习内核时所接触到的虚拟内存空间的概念!!!
其实最终答案就是文件内存映射,C++程序员对此是相当的熟悉的,文件内存映射的原理其实就是在内核加载了其文件,这样就能直接通过引用或者指针来操作这份本不该属于自己用户空间的内存。
谈到这里,其书中的概念变的深刻清晰了,为什么说DirectMemory不在JVM运行时数据区呢?因为运行时数据期指的就是用户空间了,那么DirectMemory(堆外内存)其实就是放在操作系统内核中了。
这里先说到这,有时间我会研究一下JVM源码,证明这篇文章的正确性。