Java Android位图/字节数组内存泄漏
我的android应用程序内存泄漏问题。根据我的hprof分析,它似乎是由Java Android位图/字节数组内存泄漏,java,android,memory-leaks,bitmap,Java,Android,Memory Leaks,Bitmap,我的android应用程序内存泄漏问题。根据我的hprof分析,它似乎是由SurfaceView类中的位图中的字节数组引起的 以下是对几个阵列之一的MAT分析: 以及违规类别的代码: public class AndroidFastRenderView extends SurfaceView implements Runnable { AndroidGame game; Bitmap framebuffer; Thread renderThread = null;
SurfaceView
类中的位图
中的字节
数组引起的
以下是对几个阵列之一的MAT分析:
以及违规类别的代码:
public class AndroidFastRenderView extends SurfaceView implements Runnable {
AndroidGame game;
Bitmap framebuffer;
Thread renderThread = null;
SurfaceHolder holder;
volatile boolean running = false;
public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) {
super(game);
this.game = game;
this.framebuffer = framebuffer;
this.holder = getHolder();
this.holder.setFormat(PixelFormat.RGBA_8888);
setSystemUiVisibility(
SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
public void resume() {
setSystemUiVisibility(
SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION);
running = true;
renderThread = new Thread(this);
renderThread.start();
}
public void run() {
Rect dstRect = new Rect();
long startTime = System.nanoTime();
while (running) {
if (!holder.getSurface().isValid())
continue;
float deltaTime = (System.nanoTime() - startTime) / 10000000.000f;
startTime = System.nanoTime();
game.getCurrentScreen().update(deltaTime);
game.getCurrentScreen().paint(deltaTime);
Canvas canvas = holder.lockCanvas();
canvas.getClipBounds(dstRect);
canvas.drawBitmap(framebuffer, null, dstRect, null);
holder.unlockCanvasAndPost(canvas);
}
}
public void pause() {
running = false;
while (true) {
try {
renderThread.join();
break;
} catch (InterruptedException e) {
}
}
}
public void release() {
getHolder().getSurface().release();
framebuffer.recycle();
}
}
release()
在我的活动的ondestory()中调用
frameBuffer
是使用以下行创建的:
Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, ARGB_8888);
在我的活动中。确保您的线程“renderThread”已停止。如果仍处于活动状态,它将保留对“AndroidFastRenderView”对象的引用,因此无法释放内存…帧缓冲区位图是否正在进行像素修改?还是每一帧都被创建为新的?提供的代码没有说明这一点。那么,帧缓冲区是否每帧都重新创建?@S.D.您是说需要在Activity类中进行更改?我在onCreate()方法的末尾尝试了循环使用,但这导致了一个异常,所以我将frameBuffer作为一个实例变量,并在onDestroy()中循环使用它。运行时未出错,但问题仍然存在。请在Bitmap.createBitmap
行调试断点,并查看它在活动的生命周期中运行了多少次。是否重复运行?@S.D.只有在创建活动时才会触发断点。问题是每次创建活动时,当活动被销毁时,内存使用量都会跳跃,而内存不会减少。中断不应该被弃用:对此您很抱歉,但是interrupt()
也没有解决问题interrupt()
不会停止线程。您可以通过请求线程停止来停止线程,它通过从run()
返回来停止线程。所有的interrupt()。发布的代码中的pause()
函数看起来不错——只要确保它确实被调用即可。