1. 程式人生 > >Windows 記憶體的分配

Windows 記憶體的分配

Windows 使用一種 分頁請求虛擬記憶體系統,現在我們就來分析一下這種系統。 虛擬地址空間
虛擬記憶體的概念在上個世紀五十年代就提出了,當時是作為解決不能一次裝入實際記憶體的程式這一複雜問題的方案提出的。在虛擬記憶體系統中,程式可以訪問超出可用實體記憶體的更大的地址集合,專用記憶體管理程式將這些邏輯地址對映到實際地址,使用磁碟上的臨時儲存儲存超出的部分。
Windows 所使用的現代虛擬記憶體實現中,虛擬儲存被組織成大小相同的單位,稱為 。每個作業系統程序佔用自己的 虛擬地址空間,即一組可以讀寫的虛擬記憶體頁。每個頁可以有三種狀態: 
  • 自由:還沒有程序使用這部分地址空間。如果企圖訪問這部分空間,無論讀寫都會造成某種執行時失效。該操作將導致彈出一個 Windows 對話方塊,提示出現了訪問衝突。(Java 程式不會造成這種錯誤,只有用支援指標的語言編寫的程式才可能造成這種問題。)
  • 保留:這部分地址空間保留給程序,以供將來使用,但是在交付之前,不能訪問該地址空間。很多 Java 堆在一開始處於保留狀態。
  • 提交:程式可以訪問的記憶體,得到了完全 支援,就是說已經在分頁檔案中分配了頁幀。提交的頁只有在第一次被引用時才裝入主存,因此成為 請求式分頁
圖 1 說明了程序地址空間中的虛擬頁如何對映到記憶體中的物理頁幀。

圖 1. 程序地址空間中的虛擬頁到物理頁幀的對映
 
如果執行的是 32 位機器(如一般的 Intel 處理器),那麼程序的整個虛擬地址空間就是 4GB,因為這是用 32 位所能定址的最大地址空間。Windows 通常不會允許您訪問地址空間中的所有這些記憶體,程序自己使用的只有不到一半,其他供 Windows 使用

相關推薦

windows記憶體分配總結

     由於每個程序的區域性堆很小,所以在區域性堆中分配記憶體會受到空間的限制。但這個堆是每個程序私有的,相對而言分配資料較安全,資料訪問出錯不至於影響到整個系統。      而在全域性堆中分配的記憶體是為各個程序共享的,每個程序只要擁有這個記憶體塊的控制代碼都可以訪問這塊記憶體,但是每個全域性記憶體空間需

Windows 記憶體分配

Windows 使用一種 分頁請求虛擬記憶體系統,現在我們就來分析一下這種系統。 虛擬地址空間虛擬記憶體的概念在上個世紀五十年代就提出了,當時是作為解決不能一次裝入實際記憶體的程式這一複雜問題的方案提出的。在虛擬記憶體系統中,程式可以訪問超出可用實體記憶體的更大的地址集合,專用記憶體管理程式將這些邏輯地址對映

淺談windows和linux下記憶體分配規律

首先先說明下,本文中程式碼來自牛刀教程。寫的很不錯。給我不少的啟發。謝謝了 我們都知道,在使用C語言時,比如定義一個數組,一個變數。那麼系統都會隨機的分配記憶體。那麼你知道記憶體分配的規律嗎? 讓我們用兩個實驗來說明windows和linux下,記憶體分配方式的不同。 同一

淺談記憶體對齊--linux和windows平臺下記憶體分配的差異

一.記憶體對齊的初步講解 記憶體對齊可以用一句話來概括: “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上” 例如int型別佔用4個位元組,地址只能在0,4,8等位置上。 例1: #include <stdio.h> struct xx{  

全面介紹Windows記憶體管理機制及C++記憶體分配例項

本文基本上是windows via c/c++上的內容,筆記做得不錯。。 本文背景: 在程式設計中,很多Windows或C++的記憶體函式不知道有什麼區別,更別談有效使用;根本的原因是,沒有清楚的理解作業系統的記憶體管理機制,本文企圖通過簡單的總結描述,結合例

記憶體對齊的初步講解--linux和windows平臺下記憶體分配的差異

一.記憶體對齊的初步講解 記憶體對齊可以用一句話來概括: “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上” 例如int型別佔用4個位元組,地址只能在0,4,8等位置上。 例1: #include <stdio.h> struct xx{  

全面介紹Windows記憶體管理機制及C++記憶體分配例項(一):程序空間

本文背景: 在程式設計中,很多Windows或C++的記憶體函式不知道有什麼區別,更別談有效使用;根本的原因是,沒有清楚的理解作業系統的記憶體管理機制,本文企圖通過簡單的總結描述,結合例項來闡明這個機制。 本文目的: 對Windows記憶體管理機制瞭解清楚,有效的利用C++

記憶體分配與跟蹤

編寫一個程式,包括兩個執行緒,一個執行緒用於模擬記憶體分配活動,另一個用於跟蹤第一個執行緒的記憶體行為,要求兩個執行緒之間通過訊號量實現同步,模擬記憶體活動的執行緒可以從一個檔案中讀出要進行的記憶體操作。每個記憶體操作包含如下內容: 時間:每個操作等待時間;   塊數:分配記憶體的

學習筆記-C語言6(指標與動態記憶體分配

1. 指標 指標的引入: 指標是C語言最強大的功能之一,使用指標可以儲存某個變數在記憶體中的地址,並且通過操作指標來對該片記憶體進行靈活的操作,例如改變原變數的值,或者構造複雜的資料結構。指標一般初始化為NULL(0)。& 是取地址運算,* 是間接運算子,通過 * 可以訪問與修改

JVM的垃圾收集機制和記憶體分配策略

首先給大家看一下JVM的資料區模型。 上圖是JVM的資料區模型。但是在Hotspot JVM中,我們知道執行時常量是屬於方法區的,而方法區又屬於堆。對於棧,在hotspot中虛擬機器棧和本地棧是合二為一的。 這裡在順便說一說虛擬機器物件的結構,如下圖所示

java記憶體分配之堆,棧,常量池,方法區

java棧 java棧,在函式的定義中定義的基本型別(int,long,short,byte,float,double,boolean,char)的變數資料和物件的引用變數分配的儲存空間的地方。當在程式碼塊中定義一個變數時,java棧就為這個變數分配適當的記憶體空間,當該變數退出作用域時,jav

記憶體探尋1之——值型別和引用型別的記憶體分配機制

String物件和值型別的記憶體分配機制:           同樣由前延伸,上上篇《由String型別分析,所產生的對引數傳遞之惑的解答》中,最後提及,如果將引用型別的按值傳遞和按引用傳遞,用託管堆表

c++學習之路:2.預設引數&函式過載&堆記憶體分配

預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為不同函式。 所以傳參的時候

Java中的陣列和記憶體分配

理解陣列 概念:陣列是儲存同一種資料型別多個元素的集合。也可以看成是一個容器。 陣列既可以儲存基本資料型別,也可以儲存引用資料型別,只要所有的陣列元素具有相同的資料型別即可 定義陣列的方法: ①:type[] arrayName;(推薦使用這種方式) ②:ty

5.3 記憶體分配與垃圾回收

5.3 記憶體分配與垃圾回收    在5.4部分中,我們將展示如何用一個暫存器機器實現一個SCHEME直譯器。 為了簡化討論,我們假定我們的暫存器機器有一個列表結構的記憶體,而且 操作列表結構的基本操作是原生的。當我們聚焦於在一個SCHEME直譯器中的控制機制時, 假定如此的記憶

C/C++記憶體分配【轉】

(轉自:http://blog.51cto.com/jiuxiaotian/860844) 1:c中的malloc和c++中的new有什麼區別 malloc和new有以下不同: (1)new、delete 是操作符,可以過載,只能在C++中使用。 (2)malloc、free是函式,可以覆蓋,C

深入理解Java虛擬機器總結一垃圾收集器與記憶體分配策略(二)

深入理解Java虛擬機器總結一垃圾收集器與記憶體分配策略(二) 垃圾回收概述 如何判定物件為垃圾物件 垃圾回收演算法 垃圾收集器詳解 記憶體分配策略 垃圾回收概述 如何判定物件為垃圾物件 引用計數法: 在物件

java記憶體分配與溢位

  Java程式而言,Java虛擬機器有自動記憶體管理機制,不需要開發人員去手動釋放內空間,也不容易出現記憶體洩漏和溢位的問題,一切看起來都很完美。一旦出現記憶體洩漏和溢位方面的問題,如果不瞭解Java虛擬機器是怎麼樣使用記憶體的,那麼排查起來將困難。以往對記憶體的理解僅僅停留在棧、堆這兩個部分,其實Java

記憶體分配方式以及堆和棧的區別

轉載:https://blog.csdn.net/shanchangyi/article/details/51854795 對於一個程式要執行,涉及到的記憶體分配是一個首要問題,這裡簡單說一下一個簡單的程式執行所涉及到的記憶體分配方式。另外,在資料結構中存在堆和棧的概念,棧是一種先進後出的資料結

三、Java虛擬機器自動記憶體管理機制、物件建立及記憶體分配

  1、物件是如何建立: 步驟:    (1)、虛擬機器遇到new <類名>的指令---->根據new的引數是否在常量池中定位一個類的符號引用    (2)、檢測該符號引用代表的類是否已經被載入、解析、和初始化。(如果沒有則