本文出处:http://songsun.spaces.live.com/blog/cns!2DB8261011445D70!211.entry
近期看了一些有关JVM和内存的资料,
为了避免遗忘,特在这里作一笔记。今天说说操作系统的虚拟内存先。
虚拟内存管理(VMM)是现在操作系统广泛采用的内存管理方式,为什么出现VMM了呢,当初主要是为了解决物理内存不足的问题,既然是不足,设计师们当然
就想起来用硬盘空间来协力,使用诸如LRU(最近最少使用)之类的算法,把物理内存(Main
memory)中不怎么使用的内容,转储到硬盘上以节省空间(给急需内存的程序使用),而转储到硬盘上的内容又被访问时,再转载回来(
如果总是发生这样的事,系统地效能就大大折扣了,这也是好的算法应该避免的)。
题外话:虽说VMM的实现主要是操作系统的事,但早期没有可支持VMM管理的CPU诞生时,如Intel系列,在386以前,要纯粹依靠OS自身做VMM,不仅麻烦而且效率也很差。要知道VMM是1960年以前就有这概念了,早期的实现者(如果有的话)肯定很郁闷。
继续正题,怎么做到VMM的呢,首先要定义一个概念,叫做
虚拟地址空间(virtual memory spaces),这个空间
就
是进程是装载和运行的容器,以win32为例,32位的虚拟地址空间(virtual memory
spaces)可以达到4GB那么大,这对于一般应用程序来说,几乎是富裕的太多了。这么大的空间,为了便于管理,首先按照特定粒度划分一个最小的基本单
元,叫做页(Page),比如等于64kb吧,页有三类:Free,Reserved,Committed,Free的页对于进程来说,等于是不可用的,
任何读写free页的行为都是极其无耻卑劣和下流的,要被OS严惩不贷(可以放心的是,你的Java程序不会发生这类行为,只有那些可以直接内存寻址的语
言才可能发生);而Reserved的页是进程保留将来要使用的,这部分暂时还没有实际对应(物理内存或硬盘);Committed是OS已经提交给进程
供其使用的,这部分虚拟内存可以由虚地址转换到实际的物理地址。
为什么要先说VMM呢,这和JVM有啥联系呢?这是因为JVM的堆(指Java
heap)内存是动态扩张的,但它又总是连续的(JVM为了便于垃圾清理),怎么做到这样呢?JVM会首先申请一大块内存作堆,而其中只有开始使用的部分
是Committed的,剩余的都是Reserved的,随着扩张过程,逐步把Reserved的变成Committed。而当JVM发觉堆过大值得减小时,又会把尾部的一部分堆释放回Reserved状态。
访问虚拟空间的每个地址的内容时,首先会把这个虚拟地址转换成物理地址,转换过程一般由cpu自己来完成,很快&很准,所以你不用担心速度问题或
者转换出错。每一页的基址转换好了,页内的地址用过偏移地址访问即可,几乎没有转换的开销。所以把这个转换的过程叫做Paging,如果页是Free的,
CPU会发生access
violation,二话不说就直接转去执行寻址违例的处理过程,所以windows蓝屏会来的那么突然啊!如果页是Resreved或者页被交换到硬盘
上,这时不能直接在物理内存中找到对应,那么发生Page
fault,CPU转去执行相应例程做补救,把页交换回来,过程虽然费事,但进程自己什么也感觉不到(用户可就不能幸免了)。这些关键功能都是现代CPU直接具备的,OS只要把相应处理例程准备好就OK。
附一张切来的paging示意图,点击
可看大图。
到此,一个庞大的虚拟地址空间就完全为进程准备好了,但别以为应用程序能够使用它的全部,因为操作系统及接口也是应用程序赖以生存的必不可少的,它们往往也预先落户在进程的虚拟地址空间里。
VMM还促使动态链接库(dll)技术(这个和jni有点联系)大行其道,这是别话了。
分享到:
相关推荐
1. **并发标记阶段**:G1使用并发标记清除算法,能在应用线程运行的同时进行垃圾收集,减少停顿时间。 2. ** Region划分**:通过Region划分,使得GC可以更灵活地进行局部或全局的垃圾回收。 3. **暂停预测**:G1能够...
资源名称:深入理解JVM & G1 GC内容简介:G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。《深入理解JVM & G1 GC》主要为学习Java语言的...
G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。本书主要为学习Java语言的学生、初级程序员提供GC的使用参考建议及经验,着重介绍了G1 GC ...
《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...
"JVM&g1gc;带书签,完整版本"的学习资料提供了深入了解JVM内存管理和G1垃圾收集器的详细内容。通过对G1的理解和实践,开发者可以更好地优化Java应用的性能,降低垃圾收集对应用运行的影响,实现更高效的内存管理。这...
"JVM Memory View"工具,版本号为0.93.162,就是针对这一需求而设计的JVM调试内存查看器,专为Android Studio用户提供了一个直观、高效的内存分析解决方案。 一、JVM内存概述 Java虚拟机内存主要分为以下几个区域...
jvm memory
1. **JConsole**:提供实时监控JVM状态,查看内存、线程、类加载等信息。 2. **JProfiler**:强大的性能分析工具,支持CPU、内存、线程等多方面调优。 3. **VisualVM**:集成了多种JDK自带工具,提供丰富的性能监控...
1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\
《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...
《深入理解MemoryAnalyzer:JVM内存分析利器》 在Java应用程序的开发和优化过程中,内存管理是一项至关重要的任务。MemoryAnalyzer(MAT)是一款强大的JVM内存分析工具,它能够帮助开发者深入洞察应用的内存占用...
很久之前就一直在学习JVM,但是一直也没有好好的总结,最近终于有了空闲,将之前学习的内容整理成了一个PPT。PPT也可以在这里下载: https://github.com/hitynsun/docs/tree/master/JVM 也希望大神们可以批评指正...
1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...
JVM(Java虚拟机)是Java平台的核心组件,提供了一个抽象的计算环境,使得Java程序能够在不同的操作系统上运行,实现平台独立性。JVM将Java程序编译成特定的二进制格式——类文件格式,使得Java虚拟机本身对Java编程...
内存溢出(Out Of Memory,OOM)是JVM运行过程中常见的问题,主要类型有堆溢出、栈溢出、方法区溢出等。通过分析日志和调整参数可以解决这些问题。 总结,JVM是Java编程的关键组成部分,理解其工作原理、内存模型和...
1. JVisualVM:集成在JDK中的多合一工具,可以提供内存分析、线程监控、CPU剖析等功能,方便开发者实时查看JVM状态。 2. JConsole:同样内置于JDK,提供GUI界面来监控Java应用程序的性能和资源消耗。 3. JProfiler:...
1. 类加载子系统:负责加载、验证、解析和初始化.class文件。加载阶段会找到类的二进制数据;验证阶段确保类数据符合Java语义和安全规定;解析阶段将符号引用转换为直接引用;初始化则执行类的静态初始化块。 2. ...
学习资料出处 ...2-129802936-null-null.142^v99^control&utm_term=%E6%9C%89%E5%85%B3Java%E7%9A%84JVM&spm=1018.2226.3001.4187
1. JConsole:这是Java自带的一款图形化监控工具,可以实时监控JVM的内存、线程、类加载等状态,辅助开发者分析和诊断问题。 2. JVisualVM:它提供了一个全面的视图,包括性能监视、线程分析、内存检测等功能,同时...