标签: memory-profiling

将指针设置为nil以防止Golang中的内存泄漏

我正在学习Go,作为练习,我想实现一个链表.作为参考,我查看了Go官方代码(https://golang.org/src/container/list/list.go).与我相关的一件事是这些线:

   108  // remove removes e from its list, decrements l.len, and returns e.
   109  func (l *List) remove(e *Element) *Element {
   110      e.prev.next = e.next
   111      e.next.prev = e.prev
   112      e.next = nil // avoid memory leaks
   113      e.prev = nil // avoid memory leaks
   114      e.list = nil
   115      l.len--
   116      return e
   117  } 
Run Code Online (Sandbox Code Playgroud)

我很好奇在这种情况下如何设置指向nil的指针可以防止内存泄漏?如果可能的话,我想构建一个有这个缺陷的程序,并在使用pprof进行分析时看到它(我将使用list.go的修改版本,而不使用这个nil指针设置).


为了清楚回答:如果其中一个节点有一个指向它的外部指针,那么所有相邻的被删除节点将通过该指针进行有效引用,并且不会被删除. 在此输入图像描述

  1. 我们创建一个指向Node2的外部指针
  2. 我们从列表中删除节点2-4
  3. 在这一点上,您只能期望节点1,2和5处于活动状态,其余节点将进行GC编辑.但是,由于Node2仍指向Node3等,整个链仍未收集.

garbage-collection memory-leaks memory-management go memory-profiling

15
推荐指数
1
解决办法
2146
查看次数

如何使用Python多处理和memory_profiler分析多个子进程?

我有一个使用Python multiprocessing模块生成多个工作人员的实用程序,我希望能够通过优秀的memory_profiler实用程序跟踪他们的内存使用情况,这可以完成我想要的一切 - 特别是随着时间的推移采样内存使用情况并绘制最终结果(I我不关心这个问题的逐行内存分析.

为了设置这个问题,我创建了一个更简单的脚本版本,它有一个worker函数,它分配的内存类似于库中给出的示例memory_profiler.工人如下:

import time

X6 = 10 ** 6
X7 = 10 ** 7

def worker(num, wait, amt=X6):
    """
    A function that allocates memory over time.
    """
    frame = []

    for idx in range(num):
        frame.extend([1] * amt)
        time.sleep(wait)

    del frame
Run Code Online (Sandbox Code Playgroud)

鉴于4名工人的顺序工作量如下:

if __name__ == '__main__':
    worker(5, 5, X6)
    worker(5, 2, X7)
    worker(5, 5, X6)
    worker(5, 2, X7)
Run Code Online (Sandbox Code Playgroud)

运行mprof可执行文件以配置我的脚本需要70秒,让每个工作程序一个接一个地运行.该脚本运行如下:

$ mprof run python myscript.py
Run Code Online (Sandbox Code Playgroud)

生成以下内存使用情况图:

顺序记忆生成工人

让这些工作程序同时进行,multiprocessing意味着脚本的完成速度与最慢的工作程序一样慢(25秒).该脚本如下:

import multiprocessing …
Run Code Online (Sandbox Code Playgroud)

python memory-profiling python-multiprocessing

14
推荐指数
1
解决办法
3399
查看次数

Ruby的GC.stat的字段是什么意思?

我正在使用GC.stat我们的Rails应用程序中的内存使用情况. GC.stat使用以下键返回哈希:

:count
:heap_used
:heap_length
:heap_increment
:heap_live_num
:heap_free_num
:heap_final_num
Run Code Online (Sandbox Code Playgroud)

有谁知道这些值究竟是什么意思?在Ruby源代码(gc.c)中没有关于它们的文档,只是注释:"哈希的内容是实现定义的,将来可能会更改."

其中一些字段从上下文中有意义,例如countRuby已分配的堆数.但是什么heap_final_num呢?什么是heap_increment?是heap_length最小堆大小?

我乱搞RUBY_MIN_HEAP_SLOTS,RUBY_FREE_MINRUBY_GC_MALLOC_LIMIT,但改变这些包膜增值经销商似乎不具有任何影响:heap_count:heap_length.:heap_count如果我从根本上增加最小堆插槽,我希望会下降.所以我真的想知道所有GC.stat值代表什么!

我正在使用Ruby 1.9.3.

ruby garbage-collection memory-management memory-profiling

13
推荐指数
1
解决办法
2899
查看次数

WPF GarbageCollection中的高级调试建议

情况

我们正在运行一个大型WPF应用程序,它不会释放内存很长一段时间.它不是真正的内存泄漏,因为内存最终会被释放.我知道通常情况下,这不会被认为是一个问题.不幸的是,它与WPF指挥基础设施相结合成为一个性能问题.有关更详细的说明,请参见下文.

发现

我们有自动化测试,可以执行典型的用例.有些案例工作正常,并及时释放记忆.其他人正在占用内存,直到客户端最小化,打开一个新窗口或触发Gen2集合的其他一些条件.

•使用ANTS我们看到,对象没有GC Root,但是很多引用需要完成的其他对象.

•WinDbg未显示任何准备完成的对象.

•运行几个GC.Collect(),GC.WaitForPendingFinalizers()完全释放内存.

•我们知道哪种UI操作会导致高内存条件,但我们无法识别任何可疑代码.

我们希望有关于调试此类问题的任何建议.


WPF CommandManager背景

WPF CommandManager保存WeakReferences(_requerySuggestedHandlers)的私有集合以引发CanExecuteChanged事件.处理CanExecuteChanged成本非常高(尤其是找到EventRoute CanExecute,显然是一个RoutedEvent).只要CommandManager感觉像是在执行命令就可以执行,它会遍历此集合并CanExecuteChanged在相应的命令源上调用事件.

只要存在引用对象的GC句柄,就不会从该集合中删除WeakReferences.虽然尚未收集该对象,但CommandHelper会继续处理CanExecute这些元素的事件(ButtonBase或MenuItems).如果存在大量垃圾(如我们的情况),这可能导致CanExecute事件处理程序的调用数量极大,这会导致应用程序非常滞后.

c# wpf garbage-collection finalizer memory-profiling

11
推荐指数
1
解决办法
1282
查看次数

VS2013:内存分析器不会在特定项目上显示任何内容

我想使用visual studio 2013 ultimate的内存分析器来分析WPF应用程序.但似乎存在一个问题:运行探查器后,没有可用/显示的数据.我使用的是Windows 8.1 x64

我收到此错误:

DA0002:似乎没有使用VSPerfCLREnv.cmd正确设置环境变量而收集文件.托管二进制文件的符号可能无法解析.

奇怪的是:CPU分析与这个项目一起工作,内存分析似乎适用于其他项目(我创建了一个带有空窗口的新WPF项目,并在那里测试了内存分析器并显示了数据).我还在另一台机器上测试了具有相同结果的特定项目(没有显示任何内容).

我还做了什么:我使用VSPerfCLREnv设置环境变量,如上面的错误消息中所述.我尝试过这个问题的解决方案:如何运行Visual Studio 2012内存分析器?我收到错误DA0002,但是VSPerfCmd的部分并没有真正起作用(得到的消息是我应该使用VSPerf.exe,但这也不起作用).

我认为这对VS2013来说不是问题,而是我的项目.发生此问题的上述项目是WPF应用程序.它包括一个异步套接字服务器(基于SocketAsyncEventArgs).

我清理了解决方案,将debug设置为x86,删除了项目的所有未使用的引用,并将目标框架从.net4.5设置为.net4.没有改变.我不知道为什么内存分析不起作用.也许套接字的缓冲区是错误的(因为它们不是由.net管理的)?

c# wpf memory-profiling visual-studio-2013

11
推荐指数
1
解决办法
1117
查看次数

如何追踪内存峰值?(这是ap的峰值,而不是l.)

我有一个自助服务终端应用程序,它实际上显示了一堆幻灯片,上面有各种信息.我最初在一年前开始编写代码,当时我开始使用Objective-C和iOS开发.我发现我的代码风格现在比它更清晰,而且我更有经验,所以我决定从头开始重写.

我使用Allocations工具运行我的应用程序,以查看内存使用情况.考虑到这是一个自助服务终端应用程序,一切都需要顺利运行,没有泄漏.(当然所有应用程序都需要在没有泄漏的情况下运行,但是一个自助服务终端应用程序使这个目标变得更加重要.)我看到了一些有趣的结果,所以我也运行了旧版本的代码.

运行旧版本的代码,我看到甚至运行大约1.15兆字节的内存使用量.似乎所有东西都必要时进行分配和解除分配.然而,在我的新实现中,我看到了一些不同的东西.内存使用率一直在小幅上升,然后最终似乎达到了大约1.47兆字节的使用率.以下是运行超过10小时后新分配报告的样子:

在此输入图像描述

我担心的原因有几个.

  1. 运行开始时的奇怪模式.
  2. 分配似乎达到了1.47兆字节的峰值,但是一夜之间运行表明它实际上会随着时间的推移慢慢使用越来越多的内存.这不是一件好事.

旧项目和新项目之间存在几个显着差异.

  • 旧版本使用Plists作为后备存储(我手动读取和写入plist文件.)新项目使用Core Data.

  • 新项目实现了一个库,该库在旧项目没有的每个"幻灯片"上调用.我会更关心这个库,除了我写它并且我经历了它以确保我发布了所有内容并且只在手动发布不可能的地方自动释放.

  • 这两个类都使用工厂类来创建幻灯片.在旧项目中,工厂类是单身人士.我认为将它变成普通的类可以帮助解决内存问题,因为单例从未发布过.(因此它的 属性没有被释放.在新项目中,工厂类正在被释放,所以我不确定为什么它仍然占用所有内存(如果这是导致问题的原因).

  • 旧项目在各个地方使用字符串常量.新代码使用了大量枚举来实现相同的功能.(新代码通常使用更多常量.)

如何追踪内存峰值?当应用程序丢弃它正在使用的内容时,内存全部被应用程序清理,但在应用程序终止之前它似乎没有丢弃内容.

如果有人帮我指出正确的方向,我将不胜感激.

编辑:

看起来像调峰正在通过调用引起KosherCocoa库.如果有人会介意看看它并告诉我在内存管理方面我做错了什么,我真的很感激.

memory-management objective-c instruments memory-profiling ios

10
推荐指数
1
解决办法
467
查看次数

ConcurrentHashMap内存开销

有人知道ConcurrentHashMap的内存开销是什么(与"经典"HashMap相比)?

  • 在施工?
  • 在插入元素?

java hashmap concurrenthashmap memory-profiling

10
推荐指数
2
解决办法
5977
查看次数

AWS Lambda中的Java内存分析

是否可以使用堆上所有对象的类或包来分析AWS Lambda中Java项目的内存使用情况?

堆内存分析: 堆内存分析

java heap-memory memory-profiling aws-lambda

10
推荐指数
1
解决办法
853
查看次数

读取Pythons memory_profiler的输出

我对理解memory_profilers输出有疑问.基本上,它看起来像这样:

Filename: tspviz.py

Line #    Mem usage    Increment   Line Contents
================================================
     7  34.589844 MiB  34.589844 MiB   @profile(precision=6)
     8                             def parse_arguments():
     9  34.917969 MiB   0.328125 MiB       a = [x**2 for x in range(10000)]
Run Code Online (Sandbox Code Playgroud)

在第9行,我们可以清楚地看到,我们使用了一些记忆.现在,我测量了这个列表的大小sys.getsizeof().我仔细检查它是否实际上是一个整数列表:

print(sys.getsizeof(a))
print(type(a[0]))
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

87624
<class 'int'>
Run Code Online (Sandbox Code Playgroud)

好吧,现在有一个问题.正如我所检查的那样,28在我的64位Windows机器上,Python中的int是大小的.我不知道这是否正确.但是就算是这样.10000 * 28= 0.28 MB.并且0.28 MB = 0.267028809 MiB(memory_profiler显示MiB 的输出).现在的问题是,在表中有0.328125 MiB,所以差异是0.061096191MB.

我关心的是,在Python中构建列表需要大量的内存,还是我以错误的方式解释某些内容?

和PS:为什么,当这个a列表长度时1000000,Increment这行的列中的数字,当我创建它时,就像-9xxx MiB?我的意思是为什么负数?

python memory-profiling python-3.x

10
推荐指数
1
解决办法
497
查看次数

什么使用了我的 python 进程的内存?(RSS 与 VMS)

如果我执行 Python 解释器,它大约需要 111 MB:

>>> import psutil
>>> psutil.Process().memory_info()
pmem(rss=19451904, vms=111677440, shared=6905856, text=4096, lib=0, data=12062720, dirty=0)
Run Code Online (Sandbox Code Playgroud)

导入 django 后,它使用 641 MB

>>> import django
>>> django.setup()
>>> psutil.Process().memory_info()
pmem(rss=188219392, vms=641904640, shared=27406336, text=4096, lib=0, data=284606464, dirty=0)
Run Code Online (Sandbox Code Playgroud)

WSGI进程(已经执行了一些http请求)919 MByte:

>>> psutil.Process(13843).memory_info()
pmem(rss=228777984, vms=919306240, shared=16076800, text=610304, lib=0, data=485842944, dirty=0)
Run Code Online (Sandbox Code Playgroud)

我认为这太过分了。

我可以做什么来更详细地调查这个问题?内存被什么占用了?

背景:服务器上的内存有时会不足,oom-killer 会终止进程。

python django memory-profiling

10
推荐指数
1
解决办法
8119
查看次数