物理内存

操作系统实现(二):分页和物理内存管理(转载)

北城以北 提交于 2019-12-04 03:44:39
原文链接: http://www.cppblog.com/airtrack/archive/2015/04/27/210451.html 上一篇 从 Bootloader 开始到内核载入使用的都是平坦内存,即所有地址对应实际的物理地址。现代操作系统都使用分页来管理内存,分页可以让每个进程都有完整的虚拟地址空间,进程间的虚拟地址空间相互隔离以提供页层级的保护。另外分页可以让物理内存少于虚拟地址空间,同时可以使用磁盘存储暂时未使用的内存页,提供更多的「内存」。 分页 分页通过 CPU 的 MMU(Memory Management Unit) 完成,MMU 通过当前的分页表完成虚拟地址到物理地址的转换。在 x86 下 MMU 通过两级分页表(也可以开启三级)完成地址转换,这两级分别是页目录(Page Directory)和页表(Page Table)。在 x86 下,由 cr3 寄存器存储页目录的地址(物理地址),页目录和页表都包含 1024 项,每项 4 字节,因此页目录和页表大小为 4KB ,按照 4KB 一页的话,刚好占用一页。 MMU 将虚拟地址转换成物理地址的方式是,取虚拟地址的 22~31bits 表示页目录的下标,获得页目录项定位到页表,再取 12~21bits 表示页表的下标,获得页表项定位到页,最后取 0~11bits 表示页偏移。页目录项和页表项的下标分别用

java8新特性-jvm

我的梦境 提交于 2019-12-04 01:11:17
内存结构的改变: 1.在1.8之前内存分为:栈, 堆(新生代,老年代,永久代) 注意: 永久代 几乎是不被GC 的,但是在特殊的情况下也会GC 2. 在1.8之后在堆中就没有(方法区) 永久代了,把 (方法区) 永久代换成了MetaSpace(元空间),并不放在堆中了 注意: MetaSpace是物理内存 好处:1. 元空间 发生内存溢出的情况变小 (原因物理内存大) 2.提高GC的效率 ( 元空间 很少执行GC) 来源: https://www.cnblogs.com/chenchun/p/11826462.html

java -Xms -Xmx设置java应用程序运行的内存大小,Xms Xmx PermSize MaxPermSize 区别

时光总嘲笑我的痴心妄想 提交于 2019-12-03 16:07:30
java -Xms -Xmx 设置java 应用程序运行的内存大小,Xms Xmx PermSize MaxPermSize 区别 版权声明:本文为博主原创文章,未经博主允许不得转载。 -Xms 和 -Xmx 是 Java 命令的一个选项,用来设置你的应用程序启动时的可用内存大小和运行时的可用的内存大小。 Xmx 是 java 的一个选项,用来设置你的应用程序能够使用的最大内存数(看好,只是你的应用程序,不是整个 jvm ) , 如果你的程序要花很大内存的话,那就需要修改缺省的设置,比如配置 tomcat 的时候,如果流量啊程序啊都很大的话就需要加大这个值了,不过有一点是要记住的,不要大得超过你的机器的内存,那样你的机器会受不了的,到时候就死翘翘了。 Xms 是另一个设置内存的参数 , 用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。不过同样有前面的限制,以及受到 Xmx 的限制。 不同的虚拟机的实现虽然千差万别,但是他们的运行模式都是一样的,只是性能有所不同罢了。 虚拟机只是一个软件实现,它是一个在内存中的机器,而我们机器上装的是 jre ,是为了生成这个 jvm 用的。通常来说,每次运行一个 application 都会生成一个 jvm ,但是也可以有多个程序在同一个 jvm 里面。 Eclipse 崩溃,错误提示: MyEclipse

eclipse.ini、flashbuilder.ini内存设置和堆栈非堆栈问题

一个人想着一个人 提交于 2019-12-03 16:07:05
eclipse.ini内存设置 ,flashbuilder.ini类似: -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 下面我们一一进行回答 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据

操作系统之存储和寻址

风格不统一 提交于 2019-12-03 13:49:18
本文内容转自于 https://blog.csdn.net/qq_38650606/article/details/81939414 存储: 硬盘:持久化存放 内存:关机就会没有 更加快速进行随机访问 缓存:CUP里面 多个CPU共有或者单个CPU自己共有 寄存器:距离CUP运算单元最近 存储 寻址: 寻址空间 跟物理内存和进程没有关系 32位 -> 4G 64位 -> ~10^19 Bytes 64位JVM -> 可使用更大内存,需重新编译 物理内存 运行良好的程序里面,绝大部分的数据已经在物理内存里面,优点:速度块,缺点:物理内存使用量过多会发生频繁的分页,性能变慢 分页: 寻址后将虚拟内存的数据放到物理内存中,在物理内存大小不够时,通过算法找到很久不用的东西交换进虚拟内存中 ———————————————— 版权声明:本文为CSDN博主「面包和远方」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_38650606/article/details/81939414 来源: https://www.cnblogs.com/helenwq/p/11797732.html

Tomcat项目内存参数调优

与世无争的帅哥 提交于 2019-12-03 11:31:52
一、常见的Java内存溢出有以下三种: 1. Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:JVM在启动的时候会自动设置JVM Heap的值,JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。其初始空间默认是物理内存的1/64,最大空间不可超过物理内存。JVM提供-Xmn -Xms -Xmx等选项来进行设置。 出错场景:在JVM中,如果98%的时间是用于GC,且可用的Heap size不足2%时,将会出现JVM Heap溢出 解决方法:修改JVM Heap的大小。 2.java.lang.OutOfMemoryError: PermGen space 即PermGen space溢出 解释说明:PermGen space是指内存的永久保存区域。这个区域主要存放Class和Meta信息,Class在被Load时就会被放入PermGen space。 出错场景:如果APP载入很多CLASS,就可能会出现PermGen space溢出。(因为sun的GC不会在程序运行时对PermGen space进行清理)常见于web服务器对JSP进行pre compile的时候 解决方法:修改MaxPermSize大小 3. java.lang.StackOverflowError 即栈溢出 解释说明

java.lang.OutOfMemoryError: Java heap space 解决方法

核能气质少年 提交于 2019-12-03 10:08:35
java.lang.OutOfMemoryError: Java heap space 解决方法 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 1.可以在windows 更改系统环境变量 加上JAVA_OPTS=-Xms64m -Xmx512m 2,如果用的tomcat,在windows下,可以在 C:\tomcat5.5.9\bin\catalina.bat 中加上: set JAVA_OPTS=-Xms64m -Xmx256m 位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适. 3.如果是linux系统 Linux 在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS='-Xms64 -Xmx512' java.lang.OutOfMemoryError: Java heap space 使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置

Java内存溢出的详细解决方案

ぐ巨炮叔叔 提交于 2019-12-03 05:07:14
一、内存溢出类型 1、java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它 和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者 tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能 出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了

【操作系统之十】内存分页管理与swap

拜拜、爱过 提交于 2019-12-03 04:54:16
一、虚拟内存 电脑里内存分内存条(这里我们叫物理内存)和硬盘,内存条保存程序运行时数据,硬盘持久保存数据。那么虚拟内存是什么? 程序运行会启动一个进程,进程里有程序段、全局数据、栈和堆,这些都会加载到内存里,每一部分都有对应的内存地址,进程就是一直在处理这些地址中数据。 然而在Linux下,进程不能直接读写内存地址。 进程中能访问的地址,只能是虚拟内存地址(virtual memory address)。 操作系统会把虚拟内存地址翻译成真实的内存地址。 这种内存管理方式,称为虚拟内存(virtual memory)。 特点 1、虚拟内存地址和物理内存地址类似,都是为数据提供位置索引; 2、虚拟内存地址和物理内存地址通过映射关系来关联; 3、不同进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号; 4、进程的虚拟内存地址相互独立。因此,两个进程空间可以有相同的虚拟内存地址,如0x10001000。 5、应用程序的数据读写操作的是虚拟地址,对物理内存地址一无所知。 6、程序中表达的内存地址,也都是虚拟内存地址。 7、进程对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。 优势: 1、借助虚拟内存地址,操作系统可以保障进程空间的独立性,不同进程就不可能相互篡改对方的数据,进程出错的可能性就大为减少。 2、有了虚拟内存地址,内存共享也变得简单

程序的编译,链接,运行和地址映射

匿名 (未验证) 提交于 2019-12-03 00:30:01
每一个进程在运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间: 3G为用户空间(私有)1G为内核空间(共享) 代码段:存放程序的执行代码,大小在运行前已经确定,也包含一些只读的常数变量,例字符串常量等。 数据段:存放程序中已初始化的全局变量(静态分配内存)。 堆区:用于存放进程运行中被动态分配的内存段,大小不固定,可动态扩张或缩减。 栈区:用于存放程序临时创建的局部变量,即函数括弧"{}"中定义的变量。 .o文件符号表里的符号,还没分配地址 3.链接过程 (1)所有.o文件的段进行合并,其中包含合并符号表,进行[符号解析] 符号解析:未定义的符号,找到其定义的地方 运行时:代码段、数据段 4.IA32体系虚拟地址映射 为什么不直接分配物理内存? 如果直接分配物理内存,有可能最终分配的地址被别人占用了 因为不知道哪块物理内存空闲。 第1次页面映射一定失败(在操作系统里)-->缺页异常 缺页异常处理完成之后-->重启地址映射-->成功 文章来源: 程序的编译,链接,运行和地址映射