show arp comes back with 60,000+ entries. That would explain the memory consumption and poor performance but I'm not 100% sure as to why this is happening.
When you configured
ip route 0.0.0.0 0.0.0.0 GigabitEthernet0/1, you effectively told the router that you have directly connected the entire internet to GigabitEthernet 0/1. Your router believes you, so it must send an ARP request for each new destination IP address following that default.
If the next hop router is configured with proxy-ARP (default config on Cisco routers), then this actually "works" until one of the routers hits resource exhaustion as yours did. Both routers could run out of CPU (from ARP processing), but only your router could hit a memory limitation due to the massive ARP cache. I normally disable proxy-ARP on interfaces to ensure my routers won't participate in misconfigurations like this.
The simple solution on your side is configuring an explicit IP next hop instead of pointing out the interface. If you had a masochistic streak, you could leave the route as-is and play ARP timeout games to stave off memory exhaustion, but one should never play games like that on production networks.
Default routing to an ethernet interface is bad news; every network engineer makes this mistake once. I learned the same way myself. If you're really unfortunate, the reason your ARP table is full is because something (ie a virus) decides to scan the whole internet for victims.