标签: memory-leaks

我的记忆不是免费的

我有一个相当大的程序,通常运行奇妙,但使用疯狂的内存来运行.这是一种收集大量数据的机器学习方法,因此通常没问题,但即使收集了所有数据,内存也会快速增长和增长,因此我使用valgrind massif来找出问题所在.地块顶部的堆树看起来像这样:

99.52% (60,066,179B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->43.50% (26,256,000B) 0x439785: Image::Image(SDL_Surface*) (Image.cpp:95)
| ->43.50% (26,256,000B) 0x437277: EncodedFeature::forwardPass() (EncodedFeature.cpp:65)
....
Run Code Online (Sandbox Code Playgroud)

所以我想,嗯,也许构建的图像不是免费的,但没有:

void EncodedFeature::forwardPass()
{
    // Get image:
    Image* img = new Image(screen);

    // Preprocess:
    if(preprocessor)
        preprocessor->process(img);

    // Do forward pass:
    encoder->encode(img, features);

    delete img;
}
Run Code Online (Sandbox Code Playgroud)

所以对于Image构造函数:

Image::Image(SDL_Surface* surface)
{
    this->width = surface->w;
    this->height = surface->h;
    pixels = new int*[width];
    for(int i = 0; i < width; i++)
        pixels[i] = new int[height];

    for(int x = 0; x < surface->w; …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks

6
推荐指数
1
解决办法
276
查看次数

Android EditText内存泄漏

很多人注意到活动中的EditText即使一旦完成就会持有对活动的强引用.要清楚这个EditText在布局中并且已经膨胀,没有设置监听器.这仅发生在某些设备上,例如Samsung Galaxy S4(Android 4.2.2)和其他设备.很多帖子都说没有解决方案.首先是一些有用的帖子.(最终GC会清除它,所以它在技术上不是泄漏,但对于重型内存应用程序,它需要很长时间并将导致OOM)

在EditText中Android三星内存泄漏

为什么EditText在Ice Cream Sandwich中保留其Activity的Context

EditText导致内存泄漏

未处理的内存泄漏的可能性

所提到的解决方案并不适用于所有设备.它归结为Edittext Watcher.我认为可能有一个解决方案来覆盖这个Watcher然后有一个函数来清理onDestroy().请帮忙,我已经好几天了.

这是MAT直方图

内存泄漏

android memory-leaks android-edittext android-textattributes

6
推荐指数
1
解决办法
3687
查看次数

为什么不在Java中实现equals方法导致内存泄漏

我试图了解内存泄漏的各种原因我看到的样本中的hashCode()实现了而不是equals().我已经读完了那个,如果一个人被过度骑行,另一个也因为违反合同而被过度骑行.

这是示例代码

import java.util.HashMap;
import java.util.Map;

public class MemoryLeak {

static class Key { 
    Integer id; 

    Key(Integer id) { 
        this.id = id; 
    } 

    @Override 
    public int hashCode() { 
        return id.hashCode(); 
    }   
} 
public static void main(String[] args) {
    // TODO Auto-generated method stub

    Map m = new HashMap(); 
    while (true) 
        for (int i = 0; i < 10000; i++) 
            if (!m.containsKey(i)) 
                m.put(new Key(i), "Number:" + i); 
}
}
Run Code Online (Sandbox Code Playgroud)

我知道我没有故意实现equals()方法.但我想知道为什么会在内部发生内存泄漏.

谢谢

java memory-leaks

6
推荐指数
1
解决办法
1089
查看次数

即使没有gc root,WebappClassLoader内存也会泄漏

这是HEAD DUMP(2013年10月29日更新)

我正在使用webapp工作:

  • Tomcat 7.0.24
  • Java 6
  • 春天3(与aop - cglib)
  • Log4j上的SLF4J
  • Oracle Coherence

经过大量的工作,我设法删除了对类加载器的所有强引用,现在它是垃圾收集器的候选者.那么,内存泄漏解决了吗?当然不是!因为在几次热部署之后,由于PermGen空间而出现了OOME.

感谢Yourkit,我能够检查是否WebappClassLoaderPending Finalization,这意味着它正在终结队列中等待(实际上,不是WebappClassLoader自己而是他的指示对象之一).检查内存快照我发现了几个Finalizer对Oracle Coherence类的引用...... 在此输入图像描述

这似乎是"okey":Coherence对象正在等待垃圾收集,这要归功于删除所有强引用(删除所有一致性线程,删除java安全提供程序等)所做的所有艰苦工作.我想这里没什么可做的.

所以,我正在考虑一些finalize破坏某些东西然后不允许清空终结器队列的执行.但奇怪的是,使用JMX或jmap -finalizerinfo终结器队列似乎是空的!这一切都很混乱所以我一直在其他地方搜索......

你认为这是可以做的吗?我读过一些关于CGLIB增强finalize方法的内容.如果我有权访问,Enhancer我可以创建一个回调过滤器,如下所述,但我不知道如何使用Spring AOP来管理它.

好吧,在其他地方搜索,我发现了几个弱引用java.lang.reflect.Proxy.这些是jdk动态代理吗?或者它们与Introspection内存泄漏有关?弱参考?

在此输入图像描述

信息:我正在使用Spring的上下文监听器来刷新instrospector的缓存(java.beans.Introspector.flushCaches()).我还能做些什么呢?

让我们继续.

然后,我们还有其他几个弱引用java.io.ObjectStreamClass$Caches.我的很多业务对象都有这些弱引用.

在此输入图像描述 在此输入图像描述

也许我需要刷新这些缓存.但是怎么样?

然后我们有这些与之相关的弱参考com.sun.internal.ResourceManager,java.util.logging.Loggingjava.lang.reflect.Proxy

在此输入图像描述

我可以用这个弱引用做什么?我是否需要担心这个问题,或者问题出现在终结器队列中?任何线索都会有所帮助......真的:-D

Ah, another thing, I found a weak reference from a tomcat "main" thread that will …

java tomcat memory-leaks yourkit classloader

6
推荐指数
1
解决办法
4204
查看次数

在Node.js中使用流时内存泄漏?

假设我有一个简单的http服务器,例如:

var http = require('http');

http.createServer(function (req, res) {
  req.on('data', function (data) {
    console.log('Got some data: ' + data);
  });

  req.on('end', function () {
    console.log('Request ended!');
  });

  res.end('Hello world!');
}).listen(3000);
Run Code Online (Sandbox Code Playgroud)

所以,基本上是默认的101样本,到目前为止没什么特别的 - 除了我订阅了可读流dataend事件req.现在我想知道当我不再需要这些事件时是否必须取消订阅这些事件?

或者当可读流结束时它们会自动清除吗?

像这样的代码会导致内存泄漏吗?

memory-leaks node.js

6
推荐指数
1
解决办法
3759
查看次数

静态变量,Tomcat和内存泄漏

我正在调试我在Tomcat应用程序中使用多年的问题 - 重新启动应用程序时导致的内存泄漏,因为Webapp类加载器无法进行GC.我用JProfiler拍摄堆的快照,似乎至少有一些我的静态变量没有被释放.

某些类具有静态最终成员,该成员在首次加载类时初始化,并且因为它是最终的,所以我无法在应用程序关闭时将其设置为null.

静态最终变量是Tomcat中的反模式,还是我错过了什么?我刚刚开始使用JProfiler 8,所以我可能误解了传入的引用告诉我的内容.

干杯!

卢克

java tomcat memory-leaks jprofiler

6
推荐指数
2
解决办法
3013
查看次数

pandas数据框 - 选择行和清除内存?

我有一个大型的pandas数据帧(大小= 3 GB):

x = read.table('big_table.txt',sep ='\ t',header = 0,index_col = 0)

因为我在内存限制下工作,所以我对数据帧进行了子集化:

rows = calculate_rows()#一个计算我需要的行的函数

cols = calculate_cols()#计算我需要的cols的函数

x = x.ix [rows,cols]

计算行和列的函数并不重要,但它们绝对是原始行和列的较小子集.但是,当我执行此操作时,内存使用量会增加很多!最初的目标是将内存占用减少到3GB以下,但内存使用量远远超过6GB.

我猜这是因为Python在内存中创建了数据帧的本地副本,但是没有清理它.可能还有其他事情正在发生......所以我的问题是如何对大型数据框进行子集化并清理空间?我找不到一个选择行/列的函数.

我已经阅读了很多Stack Overflow,但在这个主题上找不到多少.可能是我没有使用正确的关键字,所以如果你有建议,这也可能有所帮助.谢谢!

python memory memory-leaks memory-management pandas

6
推荐指数
2
解决办法
1万
查看次数

家庭作业:我在某个地方有内存泄漏,但我找不到它.关于如何更有效地使用valgrind的任何提示?

好的,首先,公平警告,这是一个班级的项目.除了修复我的内存泄漏之外,我不是在寻找任何帮助.我想我已经在这个C代码的空间上遵循了一些可怕的编码实践.无论如何,当我运行Valgrind来搜索内存泄漏发生的位置时,我一点都不清楚我错过了什么内存泄漏.我知道至少有两个字符串,我没有释放,但我malloc()编辑,纯粹基于valgrind输出的大小.因为我从项目中获取了一些无关的代码,valgrind行号很可能已经关闭,因此为了方便起见,我将它们标记为注释.

一点背景,我正在编写shell的基本功能.它目前执行以下操作:

1.接受用户输入

2.将输入解析为cmdin结构

3.执行命令,前提是它没有管道.

4.从我创建的cmdin中取出空间,然后从步骤1重新开始.这就是问题发生的地方.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_SIZE 1024
#define MAX_CLEN 2097152
#define READ_END 0
#define WRITE_END 1
#define CHILD_STATUS 0
struct cmdin
{
    char *cmd;
    char **args;
    int nargs;
    int pipeflag;
};

//check if the last argument of the command passed to it is a pipe.
//if so, return the position of the pipe, otherwise, return 0
//if it has already found a pipe, it will return the …
Run Code Online (Sandbox Code Playgroud)

c valgrind memory-leaks memory-management

6
推荐指数
1
解决办法
617
查看次数

.NET删除父类会将子项变为"垃圾"吗?

假设您有一个Collection<B>,并且您即将删除一个项目.实例B是从一个实例A引用的,并引用了一个实例C,如第一张图所示:

图A http://i43.tinypic.com/240wuqh.jpg

现在,由于存在指向B的引用,因此毫无疑问该对象被"删除"或被垃圾收集.它只是从集合中删除,就像这样,对吗?

图B http://i41.tinypic.com/4uxnp3.png

现在,让我们使用Collection<A>与之前相同的引用层次结构,让我们删除A的实例.

图C http://i44.tinypic.com/1zd93dt.png

如果没有其他引用A,不仅它从集合中删除,它被标记为垃圾.我对吗?并且怎么样BC?它们是否也成为垃圾,除非B引用一个实例,否则没有其他引用C

这是我所面临的简化.我想A从集合中删除一个实例,我想确保BC继续使用它.A我不再收集的地方,所有仍然活着的"孩子"对我来说都是记忆泄漏.

当我看到我制作的这些照片时,这个问题似乎太愚蠢了.但我的情况有点不那么微不足道.它看起来像这样:

图4 http://i41.tinypic.com/2ymhlq0.png

  • 在图片中,Model层为黄色,ViewModel层为绿色
  • 'A ViewModel'类引用它 A Model
  • A Model有一个B Model实例集合(在Model和ViewModel层中B都是一种子类A)
  • 每个B Model"知道它的父亲" - 引用其父"模型"实例
  • 回到VM层,'A ViewModel'拥有'B ViemModel'项目的集合
  • 任何好的ViewModel,'B ViewModel'引用'B模型'

我有这些A ViewModel实例的集合.当我删除一个时,我需要其他所有内容.如果所涉及的任何实例没有其他"外部参考"(基本上,没有其他箭头指向图片外部),被移除的"ViewModel"实例是否会将所有孩子带走?如果是这样,是否有任何"陷阱"可以使这种简化误导?如果我完全错了,为什么?:)

感谢您阅读这篇文章!

.net c# garbage-collection memory-leaks

6
推荐指数
1
解决办法
407
查看次数

垃圾 - 一旦没有线程要求它就收集锁

我有一个函数永远不能同时从两个线程调用相同的值.为了实现这一点,我有一个为给定密钥defaultdict生成新的threading.Locks.因此,我的代码看起来类似于:

from collections import defaultdict
import threading

lock_dict = defaultdict(threading.Lock)
def f(x):
    with lock_dict[x]:
        print "Locked for value x"
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何在不再需要时从defaultdict 安全地删除锁.如果不这样做,我的程序会有一个内存泄漏,当f使用许多不同的x值调用时,它会变得明显.

我不能简单地del lock_dict[x]在f结束,因为在另一个线程等待锁的情况下,那么第二个线程将锁定那也没再与lock_dict [X]相关联的锁,因此两个线程可以同时最终调用f与x的相同值.

python multithreading garbage-collection memory-leaks thread-safety

6
推荐指数
1
解决办法
190
查看次数