我开发了一个在Android上使用大量图像的应用程序.
该应用程序运行一次,填满屏幕上的信息(Layouts
,Listviews
,Textviews
,ImageViews
,等)和用户读取的信息.
没有动画,没有特效或任何可以填充内存的东西.有时候抽屉可以改变.有些是android资源,有些是保存在SDCARD文件夹中的文件.
然后用户退出(该onDestroy
方法被执行并且app由VM保持在内存中)然后在某个时刻用户再次进入.
每次用户进入应用程序时,我都可以看到内存越来越多,直到用户获得java.lang.OutOfMemoryError
.
那么处理许多图像的最佳/正确方法是什么?
我应该把它们放在静态方法中,这样它们就不会一直装载吗?我是否必须以特殊方式清洁布局或布局中使用的图像?
我已经开发了一个Android应用程序,我正处于手机应用程序开发阶段,其中一切似乎都运行良好,你想宣布胜利和发货,但你知道只需要一些内存和资源泄漏在那里; Android上只有16mb的堆,而且在Android应用程序中显然很容易泄漏.
我一直在环顾四周,到目前为止只能找到关于'hprof'和'traceview'的信息并且没有得到很多好评.
您在OS项目中遇到或开发并关心分享哪些工具或方法?
我写了C++ 10年.我遇到了内存问题,但可以通过合理的努力来修复它们.
在过去的几年里,我一直在写C#.我发现我仍然遇到很多内存问题.由于不确定性,它们很难诊断和修复,而且因为C#的理念是你绝对不必担心这些事情.
我发现的一个特殊问题是我必须在代码中明确地处理和清理所有内容.如果我不这样做,那么内存分析器并没有真正帮助,因为有太多的混乱,你无法在他们试图向你展示的所有数据中发现泄漏.我想知道我是否有错误的想法,或者我所拥有的工具是不是最好的.
什么样的策略和工具对于解决.NET中的内存泄漏很有用?
我刚刚意识到,通过阅读StackOverflow上的一些问题和答案,+=
在C#(或者我猜,其他.net语言)中添加事件处理程序会导致常见的内存泄漏......
我过去曾多次使用这样的事件处理程序,并且从未意识到它们可能导致或导致我的应用程序中的内存泄漏.
这是如何工作的(意思是,为什么这实际上会导致内存泄漏)?
我该如何解决这个问题?是否-=
足够使用相同的事件处理程序?
是否有常见的设计模式或最佳实践来处理这样的情况?
示例:我应该如何处理具有许多不同线程的应用程序,使用许多不同的事件处理程序在UI上引发多个事件?
是否有任何好的和简单的方法可以在已经构建的大型应用程序中有效地监控它?
你如何在Java中找到内存泄漏(例如,使用JHat)?我试图在JHat中加载堆转储以获得基本外观.但是,我不明白我应该如何能够找到根引用(ref)或其所谓的.基本上,我可以说有几百兆字节的哈希表条目([java.util.HashMap $ Entry或类似的东西),但地图遍布整个地方...有没有办法搜索大地图,或者可能找到大型对象树的一般根源?
[编辑]好的,到目前为止我已经阅读了答案,但我们只是说我是一个廉价的混蛋(这意味着我对学习如何使用JHat更感兴趣而不是支付JProfiler).此外,JHat始终可用,因为它是JDK的一部分.除非当然没有办法与JHat合作但是蛮力,但我无法相信可能是这样.
此外,我认为我不能实际修改(添加所有地图大小的记录)并运行它足够长的时间让我注意到泄漏.
当我在C#编译器遇到一些非常奇怪的代码时,我正在回答关于闭包(合法地)延长对象生命周期的可能性的问题(如果重要的话,那就是4.0).
我能找到的最短的repro如下:
结果:编译器创建一个闭包对象,该对象引用创建lambda的对象,当它没有理由时 - 委托的"内部"目标是静态方法,并且lambda-creation-object的实例成员不需要在委托执行时被(并且没有)触摸.实际上,编译器的行为就像程序员this
无缘无故地捕获的那样.
class Foo
{
private Action _field;
public void InstanceMethod()
{
var capturedVariable = Math.Pow(42, 1);
_field = () => StaticMethod(capturedVariable);
}
private static void StaticMethod(double arg) { }
}
Run Code Online (Sandbox Code Playgroud)
发布版本生成的代码(反编译为'simpler'C#)如下所示:
public void InstanceMethod()
{
<>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();
CS$<>8__locals2.<>4__this = this; // What's this doing here?
CS$<>8__locals2.capturedVariable = Math.Pow(42.0, 1.0);
this._field = new Action(CS$<>8__locals2.<InstanceMethod>b__0);
}
[CompilerGenerated]
private sealed class …
Run Code Online (Sandbox Code Playgroud) 在我的类中,我实现IDisposable如下:
public class User : IDisposable
{
public int id { get; protected set; }
public string name { get; protected set; }
public string pass { get; protected set; }
public User(int UserID)
{
id = UserID;
}
public User(string Username, string Password)
{
name = Username;
pass = Password;
}
// Other functions go here...
public void Dispose()
{
// Clear all property values that maybe have been set
// when the class was instantiated
id = 0; …
Run Code Online (Sandbox Code Playgroud) 我首先学习了C#,现在我开始使用C++.据我所知,new
C++中的operator 与C#中的operator 不相似.
你能解释一下这个示例代码中内存泄漏的原因吗?
class A { ... };
struct B { ... };
A *object1 = new A();
B object2 = *(new B());
Run Code Online (Sandbox Code Playgroud) 我想限制JVM使用的最大内存.注意,这不仅仅是堆,我想限制此进程使用的总内存.
在非托管C/C++代码中,检测内存泄漏的最佳实践是什么?和编码指南,以避免?(好像就这么简单;)
过去我们使用了一些愚蠢的方法:每次内存分配调用都有一个计数器增量,而在释放时减少.在程序结束时,计数器值应为零.
我知道这不是一个很好的方式,有一些捕获.(例如,如果释放由平台API调用分配的内存,则分配计数将与您的释放计数不完全匹配.当然,我们在调用分配内存的API调用时递增计数器.)
我期待您的经验,建议和一些简化此工具的工具参考.