本文共 1856 字,大约阅读时间需要 6 分钟。
操作系统之部分内存管理基本知识
内存管理的功能
- 内存空间的分配与回收
- 地址转换
- 内存空间扩充
- 存储保护
程序装入内存的过程
- 编译
- 链接(将编译后形成的目标模块与库函数链接)
- 装入(绝对装入【逻辑地址=实际地址】,可重定位装入【装入时进行地址转换】,动态重定位【执行时进行地址转换】)
扩充内存的技术
- 覆盖(同一进程,已淘汰)
- 交换(不同进程)
- 虚拟(虚拟内存最大容量与计算机地址位数相关)【基于局部性原理,将暂时不用的内容放在外存,需要时调入】
JVM架构
(1) Class Loader类加载器
负责加载 .class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文件的加载等,至于它是否可以运行,则由Execution Engine决定。
① 定位和导入二进制class文件
② 验证导入类的正确性
③ 为类分配初始化内存
④ 帮助解析符号引用.
(2) Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体作法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。
目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机,或者Java系统管理生产设备,在企业级应用中已经比较少见。
因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等。
(3) Execution Engine 执行引擎:执行包在装载类的方法中的指令,也就是方法。
(4) Runtime data area 运行数据区:
虚拟机内存或者Jvm内存,冲整个计算机内存中开辟一块内存存储Jvm需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器。
JVM内存模型
PC Register(Program Counter Register)程序计数器
- 当前线程所执行的字节码行号指示器(逻辑)
- 改变计数器的值来选取下一条需要执行的字节码指令
- 和线程一对一(线程私有)
- 对java方法技术,如果native方法则计数器值为Undefined
- 不会发生内存泄漏(注:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果)
Java虚拟机栈(Stack)
- Java方法执行的内存模型
- 包含多个栈帧 局部变量表和操作数栈 局部变量表:包含方法执行过程中的所有变量 操作数栈:入栈,出栈,复制,交换,产生消费变量
Native Method Stack本地方法栈
它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies
Method Area方法区
方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间。
Java堆(Heap)
堆这块区域是JVM中最大的,应用的对象和数据都是存在这个区域,这块区域也是线程共享的,也是 gc 主要的回收区,一个 JVM 实例只存在一个堆类存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行
JVM三大性能调优参数的含义
-Xms:设置初始分配大小,默认为物理内存的“1/64”
-Xmx:最大分配内存,默认为物理内存的“1/4”
-Xss规定了每个线程堆栈的大小。一般情况下256K是足够了。影响了此进程中并发线程数大小。
java内存模型中堆和栈的区别
静态存储:编译时确定每个数据目标在运行时的存储空间需求
栈式存储:数据区在编译时未知,运行时模块入口前确定
堆式存储:编译时或者运行时模块入口无法确定,动态分配
引用对象,数组时,栈里定义变量,堆保存目标的首地址
栈自动释放,堆需要GC
栈比堆小
栈产生的碎片远小于堆
栈支持静态和动态分配,而堆仅支持动态分配
栈的效率比堆高很多
转载地址:http://zrqen.baihongyu.com/