se o objeto é marcado para se coletado, quando o Garbage Collector for chamado (quando ele estiver disposta a isso), SEMPRE ele irá chamar o finalize() do objeto? (levando em conta que ele foi sobreescrito).
Ele não é SEMPRE executado. Ele executará somente da primeira vez.
Se no seu metodo finalize o seu codigo de alguma forma impedir que o objeto seja seja coletado. Na proxima vez que o GC tentar coletar seu objeto ele não vai executar o finalize.