当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Linux设置虚拟内存的教学与实战教程

    栏目:Linux/apache问题 时间:2020-01-04 19:44

    什么是虚拟内存?

    先直接摘抄一段 wikipedia 上的介绍。

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

    对于 C 语言里面的变量,我们可以使用 & 运算符来获得其地址, 既然是虚拟地址,就是指这个地址是虚拟的。

    虚拟地址机制不是必须的,在简单的单片机中,编写的代码编译时都需要指定物理 RAM 空间分布,不会有虚拟地址的概念,地址就是指在 RAM 中的物理地址。

    虚拟内存(之所以称为虚拟内存,是和系统中的逻辑内存和物理内存相对而言的,逻辑内存是站在进程角度看到的内存,因此是程序员关心的内容。而物理内存是站在处理器角度看到的内存,由操作系统负责管理。虚拟内存可以说是映射到这两种不同视角内存的一个技术手段。)技术就是一种由操作系统接管的按需动态内存分配的方法,它允许程序不知不觉中使用大于实际物理空间大小的存储空间(其实是将程序需要的存储空间以页的形式分散存储在物理内存和磁盘上),所以说虚拟内存彻底解放了程序员,从此程序员不用过分关心程序的大小和载入,可以自由编写程序了,繁琐的事情都交给操作系统去做吧。 SWAP(意思是“交换”、“实物交易”)分区是Linux的交换分区。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,当请求的数据不在内存中时,系统产生却页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。(需要严重注意的是它和内存映射文件的区别,linux虚拟内存或者说交换分区是在磁盘中有一个指定的区域即swap。)交换分区实际存在于磁盘中,不过Linux系统可以将它当作内存使用,当物理真实内存不足的时候交换分区就可以和真实内存进行数据交换。简单地说就是从磁盘里拿出一块空间当作内存的储备区。虽说磁盘被拿来当作内存使用,但是速度还是磁盘的速度。

    介绍

    在我们自己的购买的服务器环境中,一般是买的1g的内存,但是当服务器里面的东西装的比较多的时候就会导致内存不够用了,本文将模拟一个真实的内存不够用的情况下,如何通过修改虚拟内存来让系统正常运行,我们这里的环境是搭建一个ElasticSearch搜索的环境,但是我们的服务器内存只有1g,下面将演示如何在将1g的虚拟内存修改为4G。

    搭建ElasticSearch环境

    现在我们的服务器环境是空的,什么都没有,我们这里先将ElasticSearch上传到服务器,然后将jdk和ElasticSearch安装好。

    安装jdk

    安装教程后面更新(该文章主要介绍设置虚拟内存,安装这些东西主要是模拟一个内存不够的状态)

    安装ElasticSearch

    安装链接后面更新(该文章主要介绍设置虚拟内存,安装这些东西主要是模拟一个内存不够的状态)

    启动ElasticSearch

    启动ElasticSearch,会发现启动的时候报错了,原因是我们的服务器现在的内存并不能满足ElasticSearch需要的内存。

    [esyonghu@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch 
    [1] 3228
    [esyonghu@localhost elasticsearch-6.4.0]$ Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12)
    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Native memory allocation (mmap) failed to map 1973026816 bytes for committing reserved memory.
    # An error report file with more information is saved as:
    # logs/hs_err_pid3228.log
    [esyonghu@localhost elasticsearch-6.4.0]$