- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这是一个在 x64 机器上运行的 .NET v4 Windows 服务应用程序。在稳定运行几天后的某个时候,Windows 服务的内存消耗会像疯了一样猛增,直到它崩溃。我能够以 1.2 GB 捕获它并捕获内存转储。这是我得到的
如果我在我的转储文件上运行 !address -summary in windbg,我会得到以下结果
!地址-摘要
--- Usage Summary ------ RgnCount ------- Total Size -------- %ofBusy %ofTotal
Free 821 7ff`7e834000 ( 7.998 Tb) 99.98%
<unclassified> 3696 0`6eece000 ( 1.733 Gb) 85.67% 0.02%
Image 1851 0`0ea6f000 ( 234.434 Mb) 11.32% 0.00%
Stack 1881 0`03968000 ( 57.406 Mb) 2.77% 0.00%
TEB 628 0`004e8000 ( 4.906 Mb) 0.24% 0.00%
NlsTables 1 0`00023000 ( 140.000 kb) 0.01% 0.00%
ActivationContextData 3 0`00006000 ( 24.000 kb) 0.00% 0.00%
CsrSharedMemory 1 0`00005000 ( 20.000 kb) 0.00% 0.00%
PEB 1 0`00001000 ( 4.000 kb) 0.00% 0.00%
-
-
-
--- Type Summary (for busy) -- RgnCount ----- Total Size ----- %ofBusy %ofTotal
MEM_PRIVATE 5837 0`7115a000 ( 1.767 Gb) 87.34% 0.02%
MEM_IMAGE 2185 0`0f131000 (241.191 Mb) 11.64% 0.00%
MEM_MAPPED 40 0`01531000 ( 21.191 Mb) 1.02% 0.00%
-
-
--- State Summary ------------ RgnCount ------ Total Size ---- %ofBusy %ofTotal
MEM_FREE 821 7ff`7e834000 ( 7.998 Tb) 99.98%
MEM_COMMIT 6127 0`4fd5e000 ( 1.247 Gb) 61.66% 0.02%
MEM_RESERVE 1935 0`31a5e000 (794.367 Mb) 38.34% 0.01%
-
-
--Protect Summary(for commit)- RgnCount ------ Total Size --- %ofBusy %ofTotal
PAGE_READWRITE 3412 0`3e862000 (1000.383 Mb) 48.29% 0.01%
PAGE_EXECUTE_READ 220 0`0b12f000 ( 177.184 Mb) 8.55% 0.00%
PAGE_READONLY 646 0`02fd0000 ( 47.813 Mb) 2.31% 0.00%
PAGE_WRITECOPY 410 0`01781000 ( 23.504 Mb) 1.13% 0.00%
PAGE_READWRITE|PAGE_GUARD 1224 0`012f2000 ( 18.945 Mb) 0.91% 0.00%
PAGE_EXECUTE_READWRITE 144 0`007b9000 ( 7.723 Mb) 0.37% 0.00%
PAGE_EXECUTE_WRITECOPY 70 0`001cd000 ( 1.801 Mb) 0.09% 0.00%
PAGE_EXECUTE 1 0`00004000 ( 16.000 kb) 0.00% 0.00%
-
-
--- Largest Region by Usage ----Base Address -------- Region Size ----------
Free 0`8fff0000 7fe`59050000 ( 7.994 Tb)
<unclassified> 0`80d92000 0`0f25e000 ( 242.367 Mb)
Image fe`f6255000 0`0125a000 ( 18.352 Mb)
Stack 0`014d0000 0`000fc000 (1008.000 kb)
TEB 0`7ffde000 0`00002000 ( 8.000 kb)
NlsTables 7ff`fffb0000 0`00023000 ( 140.000 kb)
ActivationContextData 0`00030000 0`00004000 ( 16.000 kb)
CsrSharedMemory 0`7efe0000 0`00005000 ( 20.000 kb)
PEB 7ff`fffdd000 0`00001000 ( 4.000 kb)
首先,为什么未分类的文件一次显示为 1.73 GB,另一次显示为 242 MB。 (已回答。谢谢)
其次,我知道未分类可能意味着托管代码,但是根据 !eeheap 我的堆大小仅为 248 MB,实际上与 242 匹配,但甚至不接近 1.73GB。转储文件大小为 1.2 GB,远高于正常值。我从哪里去找出所有内存的使用情况。托管堆世界中的任何内容都低于 248 MB,但我使用的是 1.2 GB。
谢谢
编辑
如果我执行 !heap -s 我会得到以下结果
LFH Key : 0x000000171fab7f20
Termination on corruption : ENABLED
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-------------------------------------------------------------------------------------
Virtual block: 00000000017e0000 - 00000000017e0000 (size 0000000000000000)
Virtual block: 0000000045bd0000 - 0000000045bd0000 (size 0000000000000000)
Virtual block: 000000006fff0000 - 000000006fff0000 (size 0000000000000000)
0000000000060000 00000002 113024 102028 113024 27343 1542 11 3 1c LFH
External fragmentation 26 % (1542 free blocks)
0000000000010000 00008000 64 4 64 1 1 1 0 0
0000000000480000 00001002 3136 1380 3136 20 8 3 0 0 LFH
0000000000640000 00041002 512 8 512 3 1 1 0 0
0000000000800000 00001002 3136 1412 3136 15 7 3 0 0 LFH
00000000009d0000 00001002 3136 1380 3136 19 7 3 0 0 LFH
00000000008a0000 00041002 512 16 512 3 1 1 0 0
0000000000630000 00001002 7232 3628 7232 18 53 4 0 0 LFH
0000000000da0000 00041002 1536 856 1536 1 1 2 0 0 LFH
0000000000ef0000 00041002 1536 944 1536 4 12 2 0 0 LFH
00000000034b0000 00001002 1536 1452 1536 6 17 2 0 0 LFH
00000000019c0000 00001002 3136 1396 3136 16 6 3 0 0 LFH
0000000003be0000 00001002 1536 1072 1536 5 7 2 0 3 LFH
0000000003dc0000 00011002 512 220 512 100 60 1 0 2
0000000002520000 00001002 512 8 512 3 2 1 0 0
0000000003b60000 00001002 339712 168996 339712 151494 976 116 0 18 LFH
External fragmentation 89 % (976 free blocks)
Virtual address fragmentation 50 % (116 uncommited ranges)
0000000003f20000 00001002 64 8 64 3 1 1 0 0
0000000003d90000 00001002 64 8 64 3 1 1 0 0
0000000003ee0000 00001002 64 16 64 11 1 1 0 0
-------------------------------------------------------------------------------------
最佳答案
我最近遇到了一个非常相似的情况,并发现了一些对调查有用的技术。没有一个是 Elixir ,但每一个都更能说明问题。
1) 来自 SysInternals (http://technet.microsoft.com/en-us/sysinternals/dd535533) 的 vmmap.exe 很好地关联了 native 和托管内存的信息,并在一个漂亮的 UI 中呈现了它。可以使用以下技术收集相同的信息,但这更容易,也是一个不错的起点。遗憾的是,它不适用于转储文件,您需要一个实时进程。
2) “!address -summary”输出是更详细的“!address”输出的汇总。我发现将详细输出放入 Excel 并运行一些数据透视表很有用。使用这种技术,我发现被列为“”的大量字节实际上是 MEM_IMAGE 页面,可能是在加载 DLL 时加载的数据页面的副本,然后在数据更改时复制。我还可以过滤到大区域并深入研究特定地址。用牙签在内存转储中四处寻找并进行大量祈祷是很痛苦的,但也可以揭示。
3) 最后,我做了一个穷人版的 vmmap.exe 技术。我加载了转储文件,打开了一个日志,然后运行了!address、!eeheap、!heap 和!threads。我还使用 !teb 定位了 ~*k 中列出的线程环境 block 。我关闭了日志文件并将其加载到我最喜欢的编辑器中。然后我可以找到一个未分类的 block 并搜索以查看它是否从更详细的命令之一的输出中弹出。您可以很快将本地堆和托管堆关联起来,以将那些从可疑的未分类区域中剔除。
这些都太手动了。我很想编写一个脚本,其输出类似于我在上面的技术 3 中生成的输出,并输出一个适合查看 vmmap.exe 的 mmp 文件。总有一天。
最后一点:我在 vmmap.exe 的输出与 !address 输出之间进行了关联,并注意到 vmmap 对从各种来源识别的这些类型的区域(类似于 !heap 和 !eeheap 使用的区域)但是 !address 没有不知道。也就是说,这些是 vmmap.exe 标记但 !address 没有标记的内容:
.data
.pdata
.rdata
.text
64-bit thread stack
Domain 1
Domain 1 High Frequency Heap
Domain 1 JIT Code Heap
Domain 1 Low Frequency Heap
Domain 1 Virtual Call Stub
Domain 1 Virtual Call Stub Lookup Heap
Domain 1 Virtual Call Stub Resolve Heap
GC
Large Object Heap
Native heaps
Thread Environment Blocks
仍然有很多“私有(private)”字节下落不明,但同样,如果我能清除这些问题,我就能缩小问题的范围。
希望这能给您一些关于如何调查的想法。我在同一条船上,所以我也会很感激你的发现。谢谢!
关于debugging - 如何分析windbg中的<unclassified>内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023669/
我设计并实现了一个朴素贝叶斯文本分类器(用 Java)。我主要用它来将推文分为 20 类。为了确定文档属于我使用的类别的概率 foreach(class) { Probability = (P(
这是一个在 x64 机器上运行的 .NET v4 Windows 服务应用程序。在稳定运行几天后的某个时候,Windows 服务的内存消耗会像疯了一样猛增,直到它崩溃。我能够以 1.2 GB 捕获它并
当我运行以下简单程序时 program test ! integer m,n,r,i double precision x(2),y(3),z(4) x=(/2.0,1.0/) y=(/1.0,2.0
This question already has an answer here: Unclassifiable statement and other errors in an IF in Fort
我正在学习函数中的伪参数和局部变量。 我正在使用的书中的练习之一是编写一个程序,要求用户输入其名字和姓氏,然后将这些名字连接在一起并打印全名。这是代码: PROGRAM name_test I
我是 Fortran 90 的新用户。我正在学习如何编程。目前,我正在尝试创建一个程序来进行矩阵乘法。但是,我收到一个错误。 Program Matrix_Multiplication Imp
这个程序: C This program calculates cos(x**2) PROGRAM COSX_SQUARE IMPLICIT NONE INTEGE
有人可以帮我解决以下问题吗?我是 Fortran 新手,正在尝试使用 GCC for Windows 运行以下命令。 program jacobi implicit none double preci
我正在使用 Scikit-Learn 使用 LinearSVC 对文本(在我的例子中是推文)进行分类。当文本不适合训练集中定义的任何类别时,有没有办法将文本分类为未分类?例如,如果我有体育、政治和电影
这个问题已经有答案了: Error: Non-numeric character in statement label at (1)? (1 个回答) 已关闭 7 年前。 在我的 Linux 集群中使
例子: 0:074> !address -summary --- Usage Summary ---------------- RgnCount ----------- Total Size ----
This question already has an answer here: Fortran sqrt () error (1个答案) 3年前关闭。 因此,当我在fortran90代码中使用lo
我在 Jenkins 中定义了一个共享库: import com.codependent.jenkins.pipelines.Utils def call(List mavenGoals){ de
我是一名优秀的程序员,十分优秀!