use background goroutine to handle gc