JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存的关系的基础。
下图给出了硬件、系统、进程三个层面的内存之间的概要关系。
从硬件的角度来看,Linux系统的内存空间由两部分组成:物理内存和SWAP(位于磁盘上)。物理内存是Linux活动期间使用的主要内存区域。当物理内存不足时,Linux会将部分暂时未使用的内存数据放入磁盘上的SWAP中,以释放更多的可用内存空间;以及何时需要使用SWAP中的数据时,必须首先将其改回内存。
从Linux系统上看,除了引导系统的BIN区,整个内存空间主要被分成两个部分:内核内存(Kernelspace)、用户内存(Userspace)。
内核内存是Linux本身使用的内存空间,主要用于程序逻辑,例如程序调度,内存分配和连接硬件资源。用户内存是提供给每个进程的主要空间,Linux为每个进程提供了相同的虚拟内存空间。这使过程彼此独立,并且不会相互干扰。实现方法是使用虚拟内存技术:为每个进程提供一定数量的虚拟内存空间,并仅在实际使用虚拟内存时分配物理内存。如下图所示,对于32位Linux系统,通常将0?3G虚拟内存空间分配为用户空间,将3?4G虚拟内存空间分配为内核空间。64位系统的划分类似。
从进程的角度来看,进程能直接访问的用户内存(虚拟内存空间)被划分为5个部分:代码区、数据区、堆区、栈区、未使用区。代码区中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。数据区中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。堆是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。栈区用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。
相关推荐:【鲁班学院】java高级培训-JVM内存模型详解
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!