Tho*_*alc 11 android garbage-collection android-layout android-view
我遇到了一个非常奇怪的现象(测试设备:HTC Desire HD,Android 2.3.5).我知道这System.gc()
是不必要的和沮丧的,我不会尝试另外建议,但关键是它不应该引起问题(即它最多应该是无用的).
我有一个GLSurfaceView
在其视图层次结构中包含a的应用程序.该GLSurfaceView
实例化和增加Activity.onCreate()
.通常,应用程序的工作方式如下:
GLSurfaceView
来View.VISIBLE
GLSurfaceView
Activity.finish()
被调用)我Activity.onPause()
看起来像这样:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,一切正常.但是,在我添加以下代码后出现问题onPause()
(对于用户从主菜单退出游戏的情况):
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
System.gc();
}
Run Code Online (Sandbox Code Playgroud)
详细说明:如果Activity
是第一次启动(=即之前的应用程序进程不存在),一切正常.但是,从活动的第2次开始(=从主菜单第一次退出之后,即第一次退出之后Activity.finish()
),GLSurfaceView的帧率降低了40-50%,内置游戏变慢.
如果我删除了System.gc()
呼叫,问题就会消失.而且,如果我执行以下操作,它也可以解决问题:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
// 1. get layout root of View hierarchy
// 2. recursively remove (detach) all Views
// 3. call GC
System.gc();
}
Run Code Online (Sandbox Code Playgroud)
我没有添加具体代码,因为它很复杂,所以我使用了注释.如果我只是拆下GLSurfaceView
通道removeView()
,那还不够.需要清除整个视图层次结构.
请注意,我找不到任何内存泄漏(通过drawables/statics等没有Activity泄漏).此外,当然,当应用程序关闭时,gameThread会正常退出(我只是没有包含其源代码).
任何想法,猜测?显然,System.gc()
似乎会导致Android的Activity/layout破坏机制出现一些问题.再说一遍,正如我所说,如果我删除System.gc()
,问题就会消失.
我有Android游戏编程的经验.我曾经清除过层次结构中的所有视图,因为在运行线程时如果调用System.gc(),有时会发生您的线程对某些视图的引用,即使您调用system.gc()此视图也不会如果你一直在玩这个游戏,你会注意到你的堆内存开始增长.
这取决于内存泄漏,如果你泄漏一些KB内存,将需要更多的时间来崩溃你的游戏.它是使用Eclipse Memory Anlyser(Eclipse MAT)并比较堆栈的最佳方式.
Step1: 第一次开始游戏时 拍摄记忆快照Step2:第二次开始游戏时记忆快照 Step3: 现在比较两堆快照,它会告诉你区别.
这是一个非常有用的工具.我的游戏Apache Attack中存在巨大的内存问题.我使用这个很棒的工具修复它们.关注这个ECLIPSE MAT TUTORIAL