Hi!

I noticed a memory leak in the GLSurfaceView tutorial 
(http://developer.android.com/resources/articles/glsurfaceview.html)
Attached application leak overview (very simple):

   1. Start TheLeakActivity via button press from LeakStarterActivity
   2. TheLeakActivity uses the tutorial code to create a GLSurfaceView
   3. When pressing the back-button TheLeakActivity is closed (but leaked)
   4. Repeating 1-3 multiple times results in a OutOfMemoryException

What's leaked:

   - Each TheLeakActivity (via some context in GLThread and/or EglHelper, 
   verfied with MAT, see attached leaked.hprof)

What i've tried so far

   - Verfied the leak on android 3.2 (Samsung galaxy tab plus) and 4.0.3 
   (Acer Iconia Tab A200)
   - Searched the internet for similar problems: nothing
   - Made sure to resume and pause the GLSurfaceView in order to allow the 
   necessary housekeeping
   - Tried activity- and application-context
   - Verified in strict mode that multiple instances of TheLeakActivity 
   remain alive
   
Any Ideas how I should proceed? Could someone confirm that I'm not 
completely crazy? 

Greatly appreciate any help




-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
package at.laborg;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class LeakStarterActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	public void startLeakActivity(View view)
	{
		Intent intent = new Intent(this, TheLeakActivity.class);
		startActivity(intent);
	}
}
package at.laborg;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;

public class TheLeakActivity extends Activity
{
	private static final String TAG = "TheLeakActivity";
	private byte[] makeTheLeakCount = new byte[1024 * 1024];
	private GLSurfaceView mGLView;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectActivityLeaks().penaltyLog().build());
		super.onCreate(savedInstanceState);
		mGLView = new GLSurfaceView(getApplicationContext());
		mGLView.setRenderer(new ClearRenderer());
		setContentView(mGLView);
	}

	@Override
	protected void onPause()
	{
		Log.d(TAG,"onPause called");
		super.onPause();
		mGLView.onPause();
	}

	@Override
	protected void onResume()
	{
		Log.d(TAG,"onResume called");
		super.onResume();
		mGLView.onResume();
	}
}

class ClearRenderer implements GLSurfaceView.Renderer
{
	public void onSurfaceCreated(GL10 gl, EGLConfig config)
	{}

	public void onSurfaceChanged(GL10 gl, int w, int h)
	{
		gl.glViewport(0,0,w,h);
	}

	public void onDrawFrame(GL10 gl)
	{
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
	}
}

Attachment: main.xml
Description: XML document

Attachment: AndroidManifest.xml
Description: XML document

Reply via email to