A situação do Java no Minecraft
Minecraft exige versões diferentes de Java dependendo da própria versão: 1.16 e anteriores Java 8, 1.17 Java 16, 1.18 a 1.20.4 Java 17, 1.20.5+ Java 21. Mods compilam contra uma versão Java específica. Um mod construído pra Java 17 não roda numa JVM Java 8 (bytecode novo demais). No sentido inverso funciona tecnicamente no nível do bytecode, mas na prática os mod loaders antigos de Minecraft (Forge 1.12.2 etc.) não suportam versões modernas de Java, então cada versão MC acaba querendo um Java casado. O GDLauncher resolve isso com duas coisas: instalações Java managed (consegue baixar o Java certo por versão Minecraft automaticamente) e overrides por instância (você pode forçar um Java específico pra uma instância).
Managed vs Custom Java
Managed: o GDLauncher baixa e instala o Java ele mesmo, das builds Zulu da Azul. Vive dentro do Runtime Path em managed_javas/. Apagado com o ícone de lixeira quando quiser liberar disco. Custom: você aponta pra um Java já instalado no sistema (Adoptium Temurin, Oracle JDK, GraalVM, o que for). O GDLauncher só valida o caminho; não gerencia a instalação. Útil se você já tem um JDK tunado que quer usar. Javas detectados do sistema (os que o GDLauncher acha sem você fazer nada) não dá pra apagar do launcher porque o GDLauncher não é dono.
Perfis
Um perfil é uma regra nomeada 'use esse Java quando algo pedir a runtime Foo'. Perfis de sistema correspondem aos níveis de runtime Java da Mojang (Java 8 → Legacy, Java 16 → Alpha, Java 17 → Beta/Gamma, Java 21 → Delta, Java 25 → Epsilon). Com auto-gerenciamento ligado, o launcher escolhe o Java certo pra cada nível; desligado, você atribui na mão. Perfis custom deixam dar nome a um caminho específico e referenciar dos overrides de instância. A maioria não precisa de perfis custom, perfis de sistema + auto-gerenciamento cobrem o caso comum.
Override por instância
Em Instance Settings, a seção Java Path/Profile tem um toggle. Off (padrão): a instância usa o Java que o launcher escolher baseado na versão Minecraft (via perfis de sistema). On: você especifica ou um Path (arquivo literal) ou um Profile (perfil nomeado). Quando você quer um override: o modpack diz explicitamente 'tem que rodar no Java X.Y.Z' e quer travar; está testando uma JVM (GraalVM, Liberica NIK) e quer em uma instância sem mexer no padrão; tem várias instalações de Java 17 (Adoptium, Microsoft etc.) e quer uma específica.
Verificar qual Java foi usado de verdade
Após lançar, botão direito na instância → View Logs. O log do launcher lista o caminho completo do executável Java chamado. Confira contra o override esperado.
Erros comuns de Java
UnsupportedClassVersionError: o mod ou servidor foi construído pra Java mais novo que o que está rodando. O erro inclui um número 'class file version' (61.0 = Java 17, 65.0 = Java 21). Mude pra Java mais novo via perfil ou override. 'Could not reserve enough space for object heap': um Java 32-bit está sendo usado (limite de ~1,5 GB de heap no Windows), ou você pede mais memória contígua do que o sistema consegue. Confirme que você instalou um JDK 64-bit e que é pra esse que o override aponta; se ainda assim falhar, abaixe o slider de RAM. 'Could not find or load main class': normalmente uma instalação incompleta ou quebrada do mod loader (Forge, NeoForge, Fabric), libraries ou arquivos jvm args faltando, não é o Java em si. Reinstale o loader pelas configurações da instância, ou recrie a instância. Se ainda persistir, tente outro Java no override.