我有一个相当大的程序,通常运行奇妙,但使用疯狂的内存来运行.这是一种收集大量数据的机器学习方法,因此通常没问题,但即使收集了所有数据,内存也会快速增长和增长,因此我使用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) 很多人注意到活动中的EditText即使一旦完成就会持有对活动的强引用.要清楚这个EditText在布局中并且已经膨胀,没有设置监听器.这仅发生在某些设备上,例如Samsung Galaxy S4(Android 4.2.2)和其他设备.很多帖子都说没有解决方案.首先是一些有用的帖子.(最终GC会清除它,所以它在技术上不是泄漏,但对于重型内存应用程序,它需要很长时间并将导致OOM)
为什么EditText在Ice Cream Sandwich中保留其Activity的Context
所提到的解决方案并不适用于所有设备.它归结为Edittext Watcher.我认为可能有一个解决方案来覆盖这个Watcher然后有一个函数来清理onDestroy().请帮忙,我已经好几天了.
这是MAT直方图
android memory-leaks android-edittext android-textattributes
我试图了解内存泄漏的各种原因我看到的样本中的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()方法.但我想知道为什么会在内部发生内存泄漏.
谢谢
我正在使用webapp工作:
经过大量的工作,我设法删除了对类加载器的所有强引用,现在它是垃圾收集器的候选者.那么,内存泄漏解决了吗?当然不是!因为在几次热部署之后,由于PermGen空间而出现了OOME.
感谢Yourkit,我能够检查是否WebappClassLoader
是Pending 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.Logging
和java.lang.reflect.Proxy
我可以用这个弱引用做什么?我是否需要担心这个问题,或者问题出现在终结器队列中?任何线索都会有所帮助......真的:-D
Ah, another thing, I found a weak reference from a tomcat "main" thread that will …
假设我有一个简单的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样本,到目前为止没什么特别的 - 除了我订阅了可读流data
的end
事件req
.现在我想知道当我不再需要这些事件时是否必须取消订阅这些事件?
或者当可读流结束时它们会自动清除吗?
像这样的代码会导致内存泄漏吗?
我正在调试我在Tomcat应用程序中使用多年的问题 - 重新启动应用程序时导致的内存泄漏,因为Webapp类加载器无法进行GC.我用JProfiler拍摄堆的快照,似乎至少有一些我的静态变量没有被释放.
某些类具有静态最终成员,该成员在首次加载类时初始化,并且因为它是最终的,所以我无法在应用程序关闭时将其设置为null.
静态最终变量是Tomcat中的反模式,还是我错过了什么?我刚刚开始使用JProfiler 8,所以我可能误解了传入的引用告诉我的内容.
干杯!
卢克
我有一个大型的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,但在这个主题上找不到多少.可能是我没有使用正确的关键字,所以如果你有建议,这也可能有所帮助.谢谢!
好的,首先,公平警告,这是一个班级的项目.除了修复我的内存泄漏之外,我不是在寻找任何帮助.我想我已经在这个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) 假设您有一个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
,不仅它从集合中删除,它被标记为垃圾.我对吗?并且怎么样B
和C
?它们是否也成为垃圾,除非B
引用一个实例,否则没有其他引用C
?
这是我所面临的简化.我想A
从集合中删除一个实例,我想确保B
并C
继续使用它.在A
我不再收集的地方,所有仍然活着的"孩子"对我来说都是记忆泄漏.
当我看到我制作的这些照片时,这个问题似乎太愚蠢了.但我的情况有点不那么微不足道.它看起来像这样:
图4 http://i41.tinypic.com/2ymhlq0.png
A Model
A Model
有一个B Model
实例集合(在Model和ViewModel层中B
都是一种子类A
)B Model
"知道它的父亲" - 引用其父"模型"实例我有这些A ViewModel
实例的集合.当我删除一个时,我需要其他所有内容.如果所涉及的任何实例没有其他"外部参考"(基本上,没有其他箭头指向图片外部),被移除的"ViewModel"实例是否会将所有孩子带走?如果是这样,是否有任何"陷阱"可以使这种简化误导?如果我完全错了,为什么?:)
感谢您阅读这篇文章!
我有一个函数永远不能同时从两个线程调用相同的值.为了实现这一点,我有一个为给定密钥defaultdict
生成新的threading.Lock
s.因此,我的代码看起来类似于:
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