注意分辨显存模型和显存结构
Linux与JVM显存关系
推荐看的一篇文章:
JVM以一个进程(Process)的身分运行在Linux系统上,了解Linux与进程的显存关系深入理解java虚拟机电子版,是理解JVM与Linux显存的关系的基础。
右图给出了硬件、系统、进程三个层面的显存之间的概要关系。
JVM本质就是一个进程,因而其显存模型也有进程的通常特征。并且,JVM又不是一个普通的进程,其在显存模型上有许多崭新的特性,主要缘由有两个:1.JVM将许多原本属于操作系统管理范畴的东西,移植到了JVM内部,目的在于降低系统调用的次数;2.JavaNIO,目的在于降低用于读写IO的系统调用的开支。JVM进程与普通进程显存模型比较如右图:
JVM显存结构
线程共享的
非共享
常量池:1.6之前永久带,1.7然后堆
直接显存:并不是虚拟机运行的数据区的一部份,支持NIO,引入的一种基于channelbuffer的I/O形式
NIO
上图给出了JavaNIO使用的内核显存在linux系统中的分布情况。niobuffer主要包括:nio使用各类channel时所使用的ByteBuffer、Java程序主动使用ByteBuffer.allocateDirector申请分配的Buffer。而在PageCache上面,nio使用的显存主要包括:FileChannel.map方法打开文件占用mapped、FileChannel.transferTo和FileChannel.transferFrom所须要的Cache(图中标识niofile)。
Linux和JavaNIO在内核显存上开辟空间给程序使用,主要是降低不要的复制,以减轻IO操作系统调用的开支。诸如,将c盘文件的数据发送网卡深入理解java虚拟机电子版,使用普通方式和NIO时,数据流动比较右图所示:
将数据在内核显存和用户显存之间拷贝是比较消耗资源和时间的事情,而从上图我们可以看见,通过NIO的形式降低了2次内核显存和用户显存之间的数据拷贝。这是JavaNIO高性能的重要机制之一(另一个是异步非阻塞)。
从里面可以看出,内核显存对于Java程序性能也十分重要,因而,在界定系统显存使用时侯,一定要给内核留出一定可用空间。