Recientemente me enfrenté al clásico (y frustrante) error Unable to create an instance of the Java Virtual Machine al intentar arrancar JDeveloper 12c en un entorno moderno con 32GB de RAM.
A pesar de tener hardware de sobra, el IDE fallaba al iniciar o se sentía lento. ¿La razón? Conflictos en los archivos .conf, mala asignación de memoria heap y librerías gráficas de Java obsoletas peleando con Windows 11.
🛠️ La Solución: “The JDev Fixer”
En lugar de editar archivos manualmente cada vez que algo falla, desarrollé un Script Batch Inteligente que automatiza todo el mantenimiento.
¿Qué hace este script?
- Auto-Detección: Escanea tu disco buscando instalaciones de JDeveloper (12.2.1.3, 12.2.1.4, etc).
- Backup de Seguridad: Antes de tocar nada, crea una copia de
jdev.confyide.confcon fecha y hora. - Inyección Inteligente: Usa
findstrpara verificar si una configuración ya existe. Si ya está, no la duplica (evitando archivos corruptos por líneas repetidas). - Optimización de Memoria: Configura el Heap Size para máquinas potentes (
-Xms1024Ma-Xmx3072M). - Parche Gráfico: Desactiva Direct3D (
-Dsun.java2d.d3d=false) para evitar glitches visuales en monitores modernos. - Limpieza Profunda: Borra la carpeta de caché
system12.x.xen%AppData%que suele corromperse.
💻 El Código (Script)
Copia el siguiente código y guárdalo como fix_jdeveloper.bat.
⚠️ Importante: Edita las líneas 12 y 14 (
USER_HOMEyJDK8_PATH) para que coincidan con tus rutas.
@echo off
setlocal ENABLEDELAYEDEXPANSION
:: ==========================================================
:: JDeveloper Fixer (Optimizado 32GB + Comentarios Arriba)
:: Autor: Raul Garcia
:: Fecha: %DATE% %TIME%
:: ==========================================================
:: ------------------ CONFIGURACIONES -----------------------
:: CAMBIA ESTO POR TU USUARIO DE WINDOWS
set USER_HOME=C:\Users\TU_USUARIO\AppData\Roaming\JDeveloper
:: RUTA EXACTA DE TU JDK 8 (Sin comillas al final)
set JDK8_PATH=C:\Program Files\Java\jdk1.8.0_202
set LOG_FILE=log_ejecucion.txt
:: ----------------------------------------------------------
:: Inicializar Log
echo INICIO DE EJECUCION: %DATE% %TIME% > "%LOG_FILE%"
echo ------------------------------------------ >> "%LOG_FILE%"
:MENU
cls
echo.
echo ================================================
echo DETECTANDO VERSIONES DE JDEVELOPER INSTALADAS
echo ================================================
echo.
set INDEX=0
:: Detecta 12.2.1.3
if exist "C:\Oracle\Middleware\Oracle_Home_1.3\jdeveloper" (
set /a INDEX+=1
set VER!INDEX!=12.2.1.3
set PATH!INDEX!=C:\Oracle\Middleware\Oracle_Home_1.3\jdeveloper
)
:: Detecta 12.2.1.4
if exist "C:\Oracle\Middleware\Oracle_Home_1.4\jdeveloper" (
set /a INDEX+=1
set VER!INDEX!=12.2.1.4
set PATH!INDEX!=C:\Oracle\Middleware\Oracle_Home_1.4\jdeveloper
)
if %INDEX%==0 (
call :LOG "[ERROR] No se encontraron instalaciones."
pause
exit /b
)
echo Se encontraron %INDEX% versiones.
echo.
for /l %%i in (1,1,%INDEX%) do (
echo %%i^) JDeveloper !VER%%i!
)
echo.
echo A^) Reparar TODAS las versiones (Limpia y Optimiza)
echo X^) Salir
echo.
set /p SEL="Selecciona opcion: "
if /I "%SEL%"=="X" exit /b
if /I "%SEL%"=="A" goto FIX_ALL
set /a SELN=%SEL% 2>nul
if %SELN% LEQ 0 goto BADOPT
if %SELN% GTR %INDEX% goto BADOPT
goto FIX_ONE
:BADOPT
echo Opcion invalida.
pause
goto MENU
:: ==========================================================
:: SECCION DE EJECUCION
:: ==========================================================
:FIX_ONE
set CUR_VER=!VER%SELN%!
set CUR_PATH=!PATH%SELN%!
echo.
call :LOG "=== Iniciando reparacion para: %CUR_VER% ==="
call :REPAIR_VERSION "%CUR_VER%" "%CUR_PATH%" 1
echo.
call :LOG "[FIN] Proceso completado. Revisa el resumen arriba."
pause
exit /b
:FIX_ALL
echo.
call :LOG "=== Iniciando reparacion masiva ==="
for /l %%i in (1,1,%INDEX%) do (
set CUR_VER=!VER%%i!
set CUR_PATH=!PATH%%i!
echo.
call :LOG "*** Procesando: !CUR_VER! ***"
call :REPAIR_VERSION "!CUR_VER!" "!CUR_PATH!" 0
)
echo.
call :LOG "[FIN] Todas las reparaciones finalizaron."
pause
exit /b
:: ==========================================================
:: FUNCION PRINCIPAL DE REPARACION
:: ==========================================================
:REPAIR_VERSION
set VER=%~1
set JDEV_HOME=%~2
set SHOULD_LAUNCH=%3
call :LOG "Ruta detectada: %JDEV_HOME%"
set JDEV_CONF=%JDEV_HOME%\jdev\bin\jdev.conf
set IDE_CONF=%JDEV_HOME%\ide\bin\ide.conf
:: VALIDACION CRITICA DEL JDK
if not exist "%JDK8_PATH%\jre\bin\server\jvm.dll" (
if not exist "%JDK8_PATH%\jre\bin\client\jvm.dll" (
call :LOG "[PELIGRO] No se encontro jvm.dll en %JDK8_PATH%"
call :LOG " Esto causara el error 'Unable to create JVM'."
call :LOG " Verifica que la ruta del JDK sea correcta."
)
)
if not exist "%JDEV_CONF%" (
call :LOG "[ERROR] No existe jdev.conf en esa ruta."
goto :EOF
)
:: Procesos
call :LOG "Cerrando procesos JDeveloper/Java..."
taskkill /F /IM jdev64W.exe >> "%LOG_FILE%" 2>&1
taskkill /F /IM jdev.exe >> "%LOG_FILE%" 2>&1
taskkill /F /IM java.exe >> "%LOG_FILE%" 2>&1
:: Backup
call :LOG "Generando respaldo de configuracion..."
set BACKUP=%JDEV_HOME%\_backup_%VER%_%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%TIME:~0,2%%TIME:~3,2%
set BACKUP=%BACKUP: =0%
mkdir "%BACKUP%"
copy "%JDEV_CONF%" "%BACKUP%\jdev.conf.bak" >> "%LOG_FILE%" 2>&1
copy "%IDE_CONF%" "%BACKUP%\ide.conf.bak" >> "%LOG_FILE%" 2>&1
set PRODUCT_CONF=%USER_HOME%\%VER%.0\product.conf
if exist "%PRODUCT_CONF%" (
copy "%PRODUCT_CONF%" "%BACKUP%\product.conf.bak" >> "%LOG_FILE%" 2>&1
)
:: =============================================
:: APLICACION DE PARCHES INTELIGENTE
:: =============================================
call :LOG "Analizando e inyectando configuraciones..."
:: 1. SET JAVA HOME (Elimina anteriores y pone la nueva)
call :smart_replace_javahome "%JDEV_CONF%" "%JDK8_PATH%"
:: 2. FLAGS GRAFICOS (Solo agrega si no existen)
call :smart_ensure_flag "%JDEV_CONF%" "AddVMOption -Dsun.java2d.d3d=false"
call :smart_ensure_flag "%JDEV_CONF%" "AddVMOption -Dsun.java2d.noddraw=true"
call :smart_ensure_flag "%JDEV_CONF%" "AddVMOption -Dsun.java2d.ddoffscreen=false"
:: 3. MEMORIA RAM (Elimina configs viejas de memoria y pone las nuevas)
:: CONFIGURADO PARA TU MAQUINA DE 32GB: 1GB min / 3GB max
call :smart_replace_memory "%IDE_CONF%" "-Xms1024M" "-Xmx3072M"
:: 4. PRODUCT.CONF (Usuario)
if exist "%PRODUCT_CONF%" (
call :LOG "Actualizando product.conf de usuario..."
call :smart_replace_javahome "%PRODUCT_CONF%" "%JDK8_PATH%"
)
:: Limpieza
if exist "%USER_HOME%\%VER%.0" (
call :LOG "Limpiando cache temporal: %USER_HOME%\%VER%.0"
rmdir /S /Q "%USER_HOME%\%VER%.0" >> "%LOG_FILE%" 2>&1
)
:: ==========================================
:: RESUMEN FINAL
:: ==========================================
echo.
echo. >> "%LOG_FILE%"
call :LOG "------ RESUMEN TECNICO PARA VALIDACION (%VER%) ------"
call :LOG "1. Backup: %BACKUP%"
call :LOG "2. Archivos modificados:"
call :LOG " JDEV: %JDEV_CONF%"
call :LOG " IDE: %IDE_CONF%"
if exist "%PRODUCT_CONF%" call :LOG " USR: %PRODUCT_CONF%"
call :LOG "--------------------------------------------------------"
echo.
call :LOG "REPARACION EXITOSA para %VER%."
if "%SHOULD_LAUNCH%"=="1" (
call :LOG "Lanzando JDeveloper..."
start "" "%JDEV_HOME%\jdev\bin\jdev64W.exe"
)
goto :EOF
:: ==========================================================
:: HELPERS INTELIGENTES (Comentarios ARRIBA de la linea)
:: ==========================================================
:LOG
echo %~1
echo %~1 >> "%LOG_FILE%"
goto :EOF
:smart_ensure_flag
set "FILE=%~1"
set "LINE=%~2"
findstr /L /C:"%LINE%" "%FILE%" >nul
if %errorlevel% equ 0 (
echo [EXISTE] %LINE% >> "%LOG_FILE%"
) else (
echo [NUEVO] %LINE% >> "%LOG_FILE%"
echo. >> "%FILE%"
echo # [Agregado por Script: %DATE% %TIME%] >> "%FILE%"
echo %LINE%>> "%FILE%"
)
goto :EOF
:smart_replace_javahome
set "FILE=%~1"
set "NEW_JDK=%~2"
set "TEMPFILE=%FILE%.tmp"
findstr /L /C:"SetJavaHome %NEW_JDK%" "%FILE%" >nul
if %errorlevel% equ 0 (
echo [OK] JavaHome ya estaba correcto en %~nx1 >> "%LOG_FILE%"
goto :EOF
)
call :LOG " [UPDATE] Actualizando JavaHome en %~nx1..."
findstr /V /C:"SetJavaHome" "%FILE%" > "%TEMPFILE%"
echo. >> "%TEMPFILE%"
echo # [Actualizado: %DATE% %TIME%] >> "%TEMPFILE%"
echo SetJavaHome %NEW_JDK%>> "%TEMPFILE%"
move /Y "%TEMPFILE%" "%FILE%" >nul
goto :EOF
:smart_replace_memory
set "FILE=%~1"
set "XMS=%~2"
set "XMX=%~3"
set "TEMPFILE=%FILE%.tmp"
call :LOG " [UPDATE] Reconfigurando Memoria en %~nx1 (Limpiando duplicados)..."
findstr /V /C:"-Xms" "%FILE%" > "%TEMPFILE%"
type "%TEMPFILE%" > "%TEMPFILE%.2"
findstr /V /C:"-Xmx" "%TEMPFILE%.2" > "%TEMPFILE%"
echo. >> "%TEMPFILE%"
echo # [Memoria Script: %DATE%] >> "%TEMPFILE%"
echo AddVMOption %XMS%>> "%TEMPFILE%"
echo AddVMOption %XMX%>> "%TEMPFILE%"
del "%TEMPFILE%.2"
move /Y "%TEMPFILE%" "%FILE%" >nul
goto :EOF
🚀 Cómo usar el script
- Crea un nuevo archivo de texto y pégale el código de arriba.
- Guárdalo con el nombre
fix_jdeveloper.bat. - ¡IMPORTANTE! Dale clic derecho y selecciona Ejecutar como Administrador (necesita permisos para modificar archivos en
C:\Oracle). - El script detectará tus versiones instaladas. Presiona la tecla A para reparar todo automáticamente.
¡Listo! JDeveloper debería arrancar en segundos, sin errores de JVM y con una gestión de memoria mucho más eficiente.