Respostas:
Sampling
significa pegar muitos despejos de threads e analisar rastreamentos de pilha. Isso geralmente é mais rápido, não requer alterações de tempo de execução no seu bytecode (que pode quebrá-lo), mas também é menos preciso.
Profiling
significa instrumentar suas classes e métodos, para que eles "relatem" sempre que executados. Isso é mais preciso, pois conta todas as invocações do método instrumentado, não apenas aquelas capturadas quando o despejo é feito. No entanto, a instrumentação significa que o bytecode de suas classes é alterado e isso pode interromper seu programa. Na verdade, por esse motivo, o uso de perfis em grandes servidores de aplicativos (como JBoss ou WebLogic) geralmente faz com que tudo morra ou pare.