El problema está aquí:
holder.image.setImageURI(Uri.parse(rowItem.getruta img()));
Cada vez que un elemento se tiene que volver a dibujar vuelves a cargarlo desde su URI, lo que implica tenerlo que volver a descodificar y por tanto a ocupar memoria.
Soluciones hay muchas, como por ejemplo:
Guardar la relación de URI y Bitmap en un HashMap, así si ya la tienes cargada previamente no volverás a ocupar memoria. Si a esto además le añades que lo que almacenas en el HashMap sean SoftReferences o WeakReferences el sistema se encargará de liberarte la memoria cuando mejor le convenga, sin preocuparte de tener que hacerlo tú.
Otra solución es usar el Universal Image Loader:
https://github.com/nostra13/Android-...l-Image-Loader
Realmente está pensado para cargar imágenes desde Internet y cachearlas (para eso la uso yo), pero también lo puedes usar para imágenes locales. Te hará toda la gestión de la memoria ella sola. Aunque es una librería un poco compleja de "inicializar", pero una vez que la conoces y dominas es casi imprescindible para tratar con imágenes en Android.