windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

虽然是中文字,但是理解起来还是很困难,什么叫工作设置内存,什么叫内存专用工作集,什么叫提交大小,区别是什么,让人看了一头雾水.

通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分), 内存专用工作集是程序独占的物理内存, 提交大小是程序独占的内存(包含物理内存和在页面文件中的内存).

注:页面文件就是存放不在物理内存中的内存,文件路径一般在C:\pagefile.sys,目的是为了能够让更多的进程运行,即使合起来所占用的内存已经超过物理内存. 只要将其中一部分内存转入页面文件, 物理内存就可以空出来继续运行新的进程.

它们之间的关系:

工作设置内存 = 内存专用工作集 + 与其他进程共享的物理内存.

提交大小 = 内存专用工作集 + 保存在页面文件中的独占内存.

(其中有些例外,有时候内存专用工作集可能会比提交大小大一点点,不过可以不用考虑)

 

工作设置内存内存专用工作集在程序不变化情况下会变化, 系统会考虑程序活动情况,物理内存剩余量等减少或增加物理内存.

提交大小在程序不变化情况下不会变化,因为程序就是占用了那么多专用内存.

如果要测试程序占用的内存大小,建议在程序加载完毕后记录提交大小.其他的会变化建议不要记录.

 

下面通过代码来详细了解.

首先windows任务管理器已经不够用了,需要用Process explorer和VMMap工具.

接下来解释一些名词:

windows任务管理器中的称谓Process explorer中的称谓VMMap中的称谓
工作设置内存Working setTotal WS
内存专用工作集WS PrivatePrivate WS
提交大小Private BytesPrivate
无对应选项可显示Virtual SizeSize
无对应选项可显示无对应选项可显示Committed

 

名词说明:

Virtual Size: 程序总的所使用的内存(包含共享,非共享,物理,页面,为程序保留的但未分配的内存)

Committed: Virtual Size减去为程序保留的但未分配的内存

为程序保留的但未分配的内存: 就是告诉系统我要一块内存,但暂时不用,不过分配的地址得给我,系统就给他一个不用的地址,但不分配内存,等程序申请要使用时,就从页面或物理内存中分配出来放在那个地址上.

 

关于页面文件和物理内存如何转换稍微讲解一下,当程序要访问某个地址, 系统发现这个地址不在物理内存里,就会产生中断,然后去读取页面文件,把页面文件中与内存相关的数据拷贝到物理内存,然后标记一下这个地址已经在物理内存中了,然后继续让程序运行.

 

现在来看个例子:

程序main.exe定义了一个5M的全局变量,5M的常量,并申请了一个5M的内存,程序代码大小为2M.

 

char g_str[5*1024*1024];

const char STR[5*1024*1024];

void main()

{

char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*5);

call_lib();

}

 

程序lib.dll定义了一个4M的全局变量,4M的常量,并申请了一个4M的内存,程序代码大小为1M.

 

char g_str[4*1024*1024];

const char STR[4*1024*1024];

void call_lib()

{

char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*4);

}

Main.exe程序调用了lib.dll

 

先看main.exe总的占用的内存.

Virtual Size = 5M的全局变量 + 5M的常量 + 5M的内存 + 2M的程序代码 + 4M的全局变量 + 4M的常量 + 4M的内存 + 1M的程序代码 = 30M.

 

然后看main.exe独占的内存:

Private Bytes = 5M的全局变量 + 5M的内存

+ 4M的常量 + 4M的内存

=18M.

由上可以看出独占指的是只能进程自己使用, 比如代码,常量等就是共享的.

分配的内存,可变的全局或静态变量就是独占的.

 

至于Working set和WS Private,因为其为变化量,所以无法计算其值.

 

Working set物理内存变化规律:

一般情况下在分配出来内存后,物理内存只分配4K左右,等访问到超过4K的时候,会慢慢加大物理内存,等到系统总的物理内存小于一定值后,又会将不在前台的进程的物理内存减少.

如果进程想休息了, 可以调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);

来将自己的一些内存从物理内存转移到页面文件.


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个基于Lucene的分布式搜索引擎,它的性能和稳定性在很大程度上取决于内存的分配。本文将详细介绍Elasticsearch内存分配的相关设置。 1. 堆内存分配 堆内存是Elasticsearch最重要的内存资源,它用来存储索引和搜索数据。Elasticsearch默认的堆内存大小为1GB,可以通过调整jvm.options文件的-Xms和-Xmx参数来修改堆内存大小。 -Xms参数设置内存初始大小,-Xmx参数设置内存最大大小。建议将-Xms和-Xmx设置为相同的值,以避免堆内存频繁扩容和收缩。 2. 分片内存分配 Elasticsearch将索引分成多个分片,每个分片都会占用一定的内存资源。分片内存大小可以通过index.memory.shard_*参数进行设置,其*代表索引的类型(例如index.memory.shard_index_buffer_size)。 建议将分片内存大小设置为堆内存大小的一半左右,以留出足够的内存给其他进程使用。 3. 索引缓存 Elasticsearch的索引缓存用于加速搜索和聚合操作。索引缓存包括字段数据缓存、位缓存、过滤器缓存和查询缓存等。 索引缓存大小可以通过index.queries.cache.size和index.fielddata.cache.size参数进行设置。建议将索引缓存大小设置为堆内存大小的20%~30%左右。 4. 搜索线程池 Elasticsearch使用搜索线程池来并发执行搜索操作。搜索线程池的大小可以通过thread_pool.search.size参数进行设置。 建议将搜索线程池大小设置为处理器核心数的1~2倍左右。 5. 网络连接 Elasticsearch的网络连接包括HTTP连接和节点之间的连接。网络连接数可以通过network.host和network.tcp.connect_timeout参数进行设置。 建议将HTTP连接数和节点之间的连接数分别设置为200~500和50~100左右。 总的来说,Elasticsearch的内存分配需要综合考虑堆内存、分片内存、索引缓存、搜索线程池和网络连接等因素。合理的内存分配可以提高Elasticsearch的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值