问题六:JVM和Linux进程内存模型
XXX.class文件运行在JVM(Java虚拟机)上、底层Linux JVM内存模型。
JVM内存模型、Linux内存模型
JVM本身就是用原生代码(C / C ++)实现的,也就是说一个JVM进程就是一个C语言开发的程序在运行。JVM上可以解释.class字节码文件,在JVM层内存主要划分为:
(1)方法区
指令、Class对象、static成员变量……
(2)heap堆区
new出来的对象和常量池
(3)JVM stack虚拟机栈
函数运行需要分配栈空间,以及函数的局部变量都存储在栈上
当JVM进程运行在Linux系统上,Linux实际上给JVM进程分配的内存空间区域划分有.text段(放指令)、.rodata段(常量段)、.data(初始化数据段)、.bss(未初始化数据段)、heap堆(malloc或者new)、stack(函数运行需要分配栈空间,以及函数的局部变量都存储在栈上)。相当于把JVM方法区的指令最终映射到Linux进程的.text字段上,把数据映射到Linux进程的.data、.bss数据段上,JVM heap映射到Linux进程的heap上,JVM stack映射到Linux进程的stack上。
不管是JVM内存模型还是Linux的内存模型,进程里面的线程只有栈不一样,其他都是线程共享的。