进程使用内存指南(zz)

Python爬虫讲解及示范代码——多个url下的多种目标信息 简单概括一下,Python爬虫是一种自动化抓取网页内容的程序,它通过模拟浏览器行为,向服务器,并从中有用的信息。当然这是比较笼统的概括方式,就我个人理解而言,我们可以形象化地理解为,爬虫就好像是我们一次一次输入不同的网址,在对应的网址中找到对应的信息记录下来,然后重复这个操作直到所有网址全部搜索完毕。具体到Python代码中,就涉及到发送请求,解析网址,检索标签等步骤。 阅读详情

一、开始之前,让我们来了解一下Windows中内存管理的一些知识:

1. 机器的物理内存由两部分组成。一部分为机器的主存RAM,也就是我们内存条的大小;另一部分为虚拟内存,它就在机器的硬盘上,以页文件的形式存在。

2. 每个进程都有自己的虚拟地址空间,对于具有32位寻址能力的机器来说,这个虚拟空间的大小为4GB。现在我们使用的机器就是4GB。

3. 进程的4GB虚拟地址空间又可以分成几个部分,其中进程真正私有的空间少于2GB(这段地址空间被称作“用户方式分区”),其余的2GB多空间都是给操作系统的,且这部分空间被所有的进程共享。(参考Windows核心编程Chapter 13)

4. 为进程“分配内存”,这个概念可以细化:“保留一段地址空间”,“提交一段内存空间”,“将内存空间映射到主存”。在程序中我们通常所访问的地址都必须是进程地址空间中被保留和提交的那段地址空间。

4.1 “保留一段地址空间”:即从进程的4GB地址空间中保留一段地址空间,这个过程通过VirtualAlloc函数完成,并把分配类型参数设置为MEM_RESERVE。这段空间的起始地址必须是系统分配粒度的整数倍,大小必须是系统页面大小的整数倍。

4.2 “提交一段内存空间”:即为进程已保留的地址空间映射机器的物理内存,这里要特别注意,所谓物理内存一般并不是机器的主存,而只是机器的虚拟内存。这个过程同样又VirtualAlloc完成,只是把分配类型参数设置为MEM_COMMIT。这段空间的起始地址和大小都必须是页面大小的整数倍。这样进程的对应被提交的区域就被映射到机器的虚拟内存上。

4.3 “将内存空间映射到主存”:这点很重要,操作系统总是只有在进程提交的页面被访问时才将相应的页面加载到主存中,同时修改进程对应页面的地址空间映射。这时,进程的地址空间中的对应区域才和机器上的主存对应起来。

二、好了,接下来我们看看Process Explorer中关于内存的各个指标分别代表的含义:

Virtual Size:

     该指标记录了当前进程申请成功的其虚拟地址空间的总的空间大小,包括DLL/EXE占用的地址和通过VirtualAlloc API Reserve的Memory Space数量。请注意,该指标包括保留的地址空间。

Private Bytes:

      该指标记录了进程用户方式分区地址空间中已提交的总的空间大小。无论是直接调用API申请的内存,被Heap Manager申请的内存,或者是CLR 的managed heap,都算在里面。

Working Set:

      该指标记录了所有映射到进程虚拟地址空间的机器主存的大小,它不仅仅是用户方式分区部分的映射,而是整个进程地址空间的映射。即它同时包括内核方式分区中映射到机器主存的部分。由4.3可知,在用户方式分区部分只有在进程提交的页面被访问时才将相应的页面加载到主存中。而对于该部分的大小总是系统页面大小的整数倍。

      这里有一个问题,随着进程的不断运行,进程被访问的页面将可能不断增加,这是否意味着“Working Set”的大小会不断的累加呢?显然不是。在程序运行过程中影响“Working Set”的因素包括:(1) 机器可用主存的大小 (2) 进程本身“Working Set”的大小范围。当机器的可用主存小于一定值时,系统会释放一些老的最近没有被访问的页面,把这些页面通过交换文件交换到机器的虚拟内存中;当Working Set的大小大于该进程所设置的最大值时,同样会把一些老的页面交换到机器的虚拟内存中。当这些页面下次再被访问时,它们才加载到主存。

      由上可知,”Working Set“一定比”Private Bytes“小,因为它只是”Private Bytes“对应的地址空间中被加载到主存的那部分。

“Page Faults”

      该指标和”Working Set“密切相关,当进程访问某个页面,而这个页面却不在主存中时,就要发生一次“Page Fault“,即进程访问非”Working Set“中的页面时,发生一次”Page Fault“,同时系统将对应页面加载到主存中。

      接下来的三个指标是对”Working Set“的细化:

”WS Private“

      该指标记录了进程”Working Set“中被该进程所独享的空间大小。

"WS Shareable"

      该指标记录了进程”Working Set“中能与别的进程共享的空间大小

”WS Shared“

      该指标记录了进程”Working Set“中已经与别的进程共享的空间大小

”WS Shareable“和”WS Shared“两个指标乍一看令人感到疑惑,因为既然”Working Set“属于”Private Bytes“中的一部分,而”Private Bytes“是进程私有的,为什么会有”WS Shareable“和”WS Shared“这两项呢?

      认真一想,其实很容易理解,比如两个进程都需要同一个DLL的支持,所以在进程运行过程中,这个DLL被映射到了两个进程的地址空间中,如果这个DLL的大小为4K,在两个进程中都要提交4K的虚拟地址空间来映射这个DLL。当第一个进程访问了这个DLL时,这个DLL被加载到机器主存中,这时,第二个进程也要访问该DLL,这时,系统就不会再加载一遍该DLL了,因为这个DLL已经在主存中了。当然上面所说的访问仅仅是读取的操作,如果这时候某个进程要修改DLL对应这段地址中的某个单元时,这时,系统必须为第二个进程分配另外的新页面,并把要修改位置对应的页面拷贝的这个新页面,同时,第二个进程中的这个DLL被映射到这个新页面上。

      上面的分析中,DLL对应的4K的内存在第一个进程中便是”WS Shareable“。另外,内核方式分区中的所有代码都是被所有进程共享的,只要一个进程访问了这些页面,则在所有的进程的”Working Set“中都能体现。

三、下面我们来讨论一下这些内存指标与进程内存消耗之间的关系

      在计算机更新换代不断加速的今天,我们往往很少关注程序对内存的消耗,除非程序的内存消耗超出了我们的忍受范围——大量的泄漏、运行速度下降等。

      那么,当我们在测进程的内存使用量时,到底应该使用哪个指标能更好的反应程序的内存消耗呢?由于Windows自带的Task Manager中的”Memory Usage“所对应的指标就是”Working Set“,所以大部分人认为该指标能够很好的反应进程的内存使用量。

在得出结论之前,让我们来分析一下以上的这些指标:

就从”Working Set“开始吧。

”Working Set“:

      进程中被加载到机器主存的所有页面大小的和。它可细分为”WS Shareable“和”WS Shared“。进程访问页面不再”Working Set“中时,会发生一次”Page Fault“且同时发生一次主存与虚拟内存之间的数据交换。综上所述,我们可以得出结论:

(a)”Working Set“不是进程内存消耗的全部;

(b)所有进程”Working Set“的和也不等有机器主存总的消耗量,因为存在”Working Shareable“与别的进程共享;

(c)”Working Set“太大会影响机器的运行速度,因为”Working Set“太大会导致机器的可用主存太少,从而导致将进程的老页面释放到虚拟内存,同时,进程”Working Set“中的页面减少好,使进程发生”Page Fault“的频率更高。因为在主存与虚拟内存之间交换数据需要时间,所以机器的运行速度要减慢。

(d)”Working Set“由于数据交换的存在,该指标是动态的,在测量的过程中会不断变化。(变化的最小单位为4K)

      所以”Working Set“指标强调的是进程对机器主存的消耗,不是进程内存的全部信息。

"Private Bytes"

      该指标包含所有为进程提交的内存,包括机器主存和虚拟内存,可以认为它是进程对物理内存消耗,且该指标相对来说更加稳定。在程序产生内存泄漏时,该值一定是不断上涨的。

      综上所述,个人更倾向于使用”Private Bytes“来定量进程的内存消耗和分析进程的内存泄漏。 

RAG-Anything 实战指南:从零构建企业级多模态知识库 本文是RAG-Anything的实战指南,详细介绍了如何从零构建企业级多模态知识库。通过一体化框架,它能无差别解析文本、表格、图片、公式等多格式文档,并构建可深度理解和智能检索的知识图谱。指南涵盖了环境搭建、核心实战、智能查询及生产级部署优化,帮助企业将杂乱文档转化为智能知识大脑。 阅读详情

相关推荐

Microsoft Forms功能深度解析:企业数据收集与协作的智能利器

Microsoft Forms是微软365生态中的在线表单工具,支持问卷调查、测验和投票创建,具备拖拽式界面、多题型设计和实时数据分析功能。其核心价值在于易用性、跨平台兼容性以及与Teams、SharePoint等微软服务的深度集成,满足GDPR/HIPAA等合规要求。提供表单创建、权限管理、自动化流程(通过Power Automate)和审计日志等功能,适用于金融、医疗、教育等多行业场景。虽然存在逻辑分支有限等约束,但通过案例证明能显著提升数据收集效率(达70-85%)。使用时需注意许可证配置(Busin

xueyunshengling的博客 9099

为什么Java程序占用的内存比实际分配的多

很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存。堆只是影响Java程序占用内存数量的一个因素。要更好的理解你的Java程序将会占用多大的内存需要先了解有哪些因素会影响到内存的占用。这些因素包括:   ● 对象(Objects)   ● 类(Classes)   ● 线程(Theads)   ● 本地数据结构(Native data structures)   ● 本地代码(Native code)   每个因素对内存占用的影响又会随着应用程序、运行环境和系统平台的不同而变化,那怎样计算

修改Windows系统单进程使用内存上限

修改Windows系统单进程使用内存上限,例:某程序调用内存WINDOWS系统上限为2G,为使该程序完全的使用4GB内存,可以通过文档中的方法修改

你的进程使用了多少内存

一、开始之前,让我们来了解一下Windows内存管理的一些知识:1. 机器的物理内存由两部分组成。一部分为机器的主存RAM,也就是我们内存条的大小;另一部分为虚拟内存,它就在机器的硬盘上,以页文件的形式存在。2. 每个进程都有自己的虚拟地址空间,对于具有32位寻址能力的机器来说,这个虚拟空间的大小为4GB。现在我们使用的机器就是4GB。3. 进程的4GB虚拟地址空间又可以分成

xiejiuhua的专栏 1287

一个进程能用的最大内存(堆区)空间大小为1G

网上看到的分析: 32位意味着4G的寻址空间,linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身,成为“系统空间”,而较低的3G字节(从0x00000000到0xbffffff)用作各进程的“用户空间”。这样,理论上每个进程可以使用的用户空间都是3G。当然,实际的空间大小收到物理存储器大小的限制。虽然各个进程拥有其自己的3G用户空间,系统空间

SprintfWater的专栏 1万+

进程空间简介

进程空间简介 进程空间分为:内核空间和用户空间进程空间的分布如下图所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAqqeQex-1592141032908)(C:\Users\36262\AppData\Roaming\Typora\typora-user-images\image-20200603162443715.png)] 32位windows下,一个进程空间4G:内核占2G,用户占2G。一个线程默认栈是1M,所以一个进程最大开2048个线程。 当然内存

小飞侠的博客 2735

重学操作系统----24 | 虚拟内存 :一个程序最多能使用多少内存

目录 一、为什么内存不够用? 二、交换(Swap)技术 三、虚拟内存 3.1页(Page)和页表 3.2MMU 3.3 页表条目 3.4大页面问题 四、问题 4.1 一个程序最多能使用多少内? 4.2可不可以利用哈希表直接将页编号映射到 Frame 编号? 内存是稀缺的,随着应用使用内存也在膨胀。 当程序越来复杂,进程内存的需求会越来越大。 从安全角度考虑,进程使用内存需要隔离。 从内存一致性问题,存在不希望 CPU 进行缓存的场景。 这个时候,有一个虚拟化层承接各种...

MyySophia的博客 1786

论HTML中相对URL的选取

论HTML中相对URL的选取HTML中的相对URL绝对是个艺术,其变化多端简直几近于C语言的缓冲区溢出。下面谈一下偶在调试中遇到的几个相对URL的问题。1、真正的相对路径据个例子,假如你有一个调试用的服务器地址为"http://localhost"。其下还有几个子功能。包括"http://localhost/hello"和"http://localhost/hello/test"。这时就可以考虑使

河边的小屋 7289

HTML中相对URL的选取

转自:http://blog.csdn.net/gashero/article/details/1483283 HTML中的相对URL绝对是个艺术,其变化多端简直几近于C语言的缓冲区溢出。下面谈一下偶在调试中遇到的几个相对URL的问题。1、真正的相对路径据个例子,假如你有一个调试用的服务器地址为"http://localhost"。其下还有几个子功能。包括"http://localhost/he...

BigDragon 571

Jsoup获取绝对href+select用法

Jsoup

qq_44885775的博客 1715

HTML的URL与Servlet的URL对应

 HTML的URL与Servlet的URL对应学习过Servlet的同学,都应该对配置文件的Servlet的URL设置,感到困惑。这里就说下:  首先先说Servlet的URL设置:  当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet

Jevon's Blog 8604

url、图像img和链接a

前端基础

m0_61610374的博客 1321

基于requests_html的python爬虫

今天介绍一个相对性能更高的爬虫库requests_html,会不会感觉和requests有点联系?是的。为什么开始不直接介绍呢?因为我觉得requests是最基本入门的东西,并且在学习过程中也能学到很多东西。我的python老师在介绍这两个库时是直接一起讲的,然后我就很混乱,各自特点以及用法都分不清楚。不是说老师讲得不好啊,老师是高手,是我太菜了~.~

2402_88126487的博客 1254

html标签事件属性,HTML常用标签属性及事件属性

HTML中的标签属性可以赋予标签更多的信息,属性总是以key :value即名称/值对的形式出现。属性可分为全局属性与私有属性,全局属性是指所有HTML标签都可以使用,而私有属性是针对部分标签设置的;下面分别从标签全局属性、私有属性和事件属性这三个维度进行介绍。标签全局属性标签全局属性常见的有:class、id、style、title、dir、lang以及HTML5新增的属性draggable、d...

weixin_39942400的博客 787

HTML+CSS

HTML文件后缀为.html首先html有固定的基本结构</</</</</其中<html>是根标签,<head>和<body>是子标签。

2405_88415278的博客 1361

HTML表单标签HTML框架标签

(1) <form>...</form> 表单标签 form标签常⽤属性: *action属性:提交的⽬标地址(URL) *method属性:提交⽅式:get(默认)和post get⽅式是URL地址栏可⻅,⻓度受限制(IE2k ⽕狐8k),相对不安全. post⽅式是URL地址不可⻅,⻓度不受限制,相对安全. enctype:提交类型 target: 在何处打开⽬标 URL。 name:属性为表单起个名字.在HTML5中使⽤ id 代替。 (2) <input> 表

鸡叉骨的博客 384

复习html的第二章

HTML(英语:Hyper Text Markup Language,简称:HTML )也叫作超文本标记语言,是一种使用结构化 Web 网页及其内容的标记语言,您可以使用 HTML 来建立自己的 WEB 站点。最后,在可用的六个标题级别中,您应该保证每个页面中标题级别的使用不超过三个,除非您认为有必要使用更多。自定义列表中的一个术语名可以对应多重定义或者多个术语名对应同一个定义,如果只有术语名或者只有定义也是可行的,也就是说 与 在其中数量不限、对应关系不限。列表项项使用数字来标记。

m0_61981943的博客 1303

如何用切片工具做html网页,ps中的切片工具怎么用,怎么将html文本添加到切片...

显示切片选项对话框执行下列操作之一:使用切片选择工具 双击切片。(如果该工具未显示,请按住“裁剪”或“切片”工具)。如果切片选择工具是现用的,则单击选项栏中的“切片选项”按钮。此方法不在“存储为 Web 和设备所用格式”对话框中。指定切片内容类型您可以指定:在与 HTML 文件一起导出时,切片数据在 Web 浏览器中的显示方式。可用的选项将因选择的切片类型而异。图像切片包含图像数据。这是默认的内容...

weixin_30621659的博客 786

HTML表单标签

HTML表单标签 (1) form表单标签 form标签常⽤属性: *action属性:提交的⽬标地址(URL) *method属性:提交⽅式:get(默认)和post get⽅式是URL地址栏可⻅,⻓度受限制(IE2k ⽕狐8k),相对不安全. post⽅式是URL地址不可⻅,⻓度不受限制,相对安全. enctype:提交类型 target: 在何处打开⽬标 URL。 name:属性为表单起个名字.在HTML5中使⽤ id 代替 (2) 表单项标签input定义输⼊字段,⽤户可在其中输⼊

Aiden_cc的博客 266

107页PPT!数字化转型企业架构设计战略方案:总体架构、业务架构(BA)、应用架构(AA)、数据架构(IA)、技术架构(TA).pptx

107页PPT!数字化转型企业架构设计战略方案:总体架构、业务架构(BA)、应用架构(AA)、数据架构(IA)、技术架构(TA).pptx

上一篇: pragma指令简介
下一篇: C Runtime Library来历, API, MFC, ATL关系
aleonchen
博客等级 码龄23年 1粉丝 3原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值