The limit of ten spikes can be adjusted. But that’s not really what you want. what you want is that spikes don’t just appear to vanish while you can still see them.
What you want to do is have the spikes get removed after they have gone off the screen. The trick to removing things from an ArrayList is to loop over them in reverse. Consider:
for( int i = spikes.size()-1; i >=0; i--){
spikes.get(i).render();
spikes.get(i).move();
if( spikes.get(i).y > height + 100 ){ // It's way off-screen!
spikes.remove(i);
}
}