# IBM 31-bit Runtime Environment for Linux sobre zSeries, Java 2 Technology Edition, Versión 1.4.1; Guía del usuario

# Información de copyright

Nota: antes de utilizar esta información y el producto al que da soporte, asegúrese de leer la información general que aparece en Avisos.

Esta edición de la Guía del usuario se aplica a IBM 31-bit Runtime Environment for Linux sobre zSeries, Java 2 Technology Edition, Versión 1.4.1, y a todos los releases y modificaciones subsiguientes, a menos que se indique lo contrario en nuevas ediciones.

(c) Copyright Sun Microsystems, Inc. 1997, 2002, 901 San Antonio Rd., Palo Alto, CA 94303 USA. Reservados todos los derechos.

(c) Copyright International Business Machines Corporation, 1999, 2003. Reservados todos los derechos.

Derechos restringidos para los usuarios del Gobierno de los Estados Unidos - Su uso, duplicación o divulgación están restringidos por el GSA ADP Schedule Contract con IBM Corp.

# Prefacio

El IBM(R) 31-bit Runtime Environment for Linux sobre zSeries(R), Java(TM) 2 Technology Edition, Versión 1.4.1 contiene la Java Virtual Machine (JVM), clases Java de Sun Microsystems centrales y archivos de soporte. El Runtime Environment no contiene todas las clases que se encuentran en el paquete del SDK.

La Guía del usuario proporciona información general sobre el Runtime Environment e información específica sobre las diferencias en la implementación de IBM del Runtime Environment comparada con la implementación de Sun. Lea esta Guía del usuario además de la documentación más amplia que se proporciona en el sitio Web de Sun: http://java.sun.com.

Para obtener una lista de distribuciones sobre las que se ha comprobado el SDK para Linux, consulte: http://www-106.ibm.com/developerworks/java/jdk/linux/tested.html

Tenga en cuenta que el Runtime Environment para Linux es un subconjunto del SDK y sólo le permite ejecutar aplicaciones Java. Si ha instalado el SDK, está incluido el Runtime Environment.

Los términos "Runtime Environment" y "Java Virtual Machine" se utilizan de manera indistinta a lo largo de esta Guía del usuario.

Los cambios técnicos de esta Guía del usuario 1.4.1, que no sean los menores u obvios como la actualización de la versión "1.4.0" a "1.4.1", están indicados en rojo cuando se trata de HTML o una copia impresa en color y mediante barras verticales a la izquierda de los cambios.

# Contenido

Información de copyright

Prefacio

Visión general

- Compatibilidad de versiones
- Archivos incluidos con el Runtime Environment para Linux
- Acuerdo de licencia
- Compilador just-in-time (JIT)
- Interfaz de métodos nativa e interfaz nativa de Java

  Configuración del Runtime Environment para Linux

  Desinstalación del Runtime Environment para Linux

- Desinstalación del paquete instalable Red Hat Package Manager (RPM)
- Desinstalación del paquete comprimido Tape Archive (TAR)

  Inicio de una aplicación Java

- Resumen de mandatos
- Opciones
- Opciones estándar
- Opciones no estándar
- Globalización del mandato java
- Trabajo con classpaths
- |Cómo procesa las señales la JVM
- |Señales utilizadas por la JVM
- |Enlace de un controlador de código nativo con la biblioteca de encadenamiento de señales
- Trabajo con bootclasspath
- Cómo especificar una política de recopilación de desechos
- Tiempo de pausa
- Reducción del tiempo de pausa
- Entornos con almacenamientos dinámicos muy llenos
- Información adicional sobre la recopilación de desechos

  Obtención del número de versión y de nivel de compilación de IBM

  Trabajo con pilas flotantes

  Conmutación del método de entrada en idiomas DBCS

  Ejemplo del Runtime

  Instalación de la aplicación en un sistema de usuario

  Limitaciones conocidas

  Avisos

- Marcas registradas

  # Visión general

  El Runtime Environment para Linux contiene el subconjunto de clases necesarias para crear un entorno de ejecución Java y para ejecutar programas Java. También contiene la JVM (Máquina Virtual Java), clases Java y archivos de soporte. El Runtime Environment para Linux contiene solamente un subconjunto de las clases incluidas en el SDK.

  ## Compatibilidad de versiones

  |En general, cualquier applet o aplicación que se ejecute en la |versión 1.1.8, 1.2.2 ó 1.3.1 del SDK |para Linux debería ejecutarse correctamente en esta versión. Los |applets que dependen de las API Java 1.4.1 de Sun sólo funcionan |en navegadores que soportan las API Java 1.4.1.

  No se garantiza que las clases 1.4.1 compiladas funcionen en releases del Runtime Environment anteriores al 1.4.0.

  ## Archivos incluidos con el Runtime Environment para Linux

  El Runtime Environment para Linux incluye archivos .so no depurables y los archivos de clases necesarios para dar soporte a un programa durante el tiempo de ejecución. El Runtime Environment para Linux no incluye ninguna de las herramientas de desarrollo, del tipo appletviewer o javac, ni clases que pudieran pertenecer sólo a un sistema de desarrollo.

  ## Acuerdo de licencia

  El archivo LICENSE_xx.html contiene el acuerdo de licencia del software Runtime Environment para Linux. xx es la abreviatura del idioma.

  Para ver o imprimir el acuerdo de licencia, abra el archivo en un navegador Web.

  ## Compilador just-in-time (JIT)

  El compilador JIT (just-in-time) (libjitc.so) genera dinámicamente el código máquina utilizado con frecuencia por secuencias de código de bytes en aplicaciones o applets Java mientras se están ejecutando.

  El Runtime Environment para Linux incluye el compilador JIT (libjitc.so), que, por omisión, está habilitado.Es posible inhabilitar el JIT para contribuir a aislar un problema con una aplicación Java, un applet o el mismo compilador.

  Para inhabilitar el compilador JIT, escriba lo siguiente en el indicador de shell en la ventana donde ejecutará la aplicación:

          export JAVA_COMPILER=NONE

  Para habilitar el compilador JIT, escriba lo siguiente en el indicador de shell :

          export JAVA_COMPILER=jitc

  Para verificar si el JIT está habilitado o no, escriba lo siguiente en el indicador de shell:

          java -version

  Si el JIT se está utilizando, aparece un mensaje que incluye lo siguiente:

      (JIT enabled: jitc)

  Si el JIT no se está utilizando, aparece un mensaje que incluye:

      (JIT disabled)

  ## Interfaz de métodos nativa e interfaz nativa de Java

  IBM no da soporte a la interfaz de métodos nativa en este release. No utilice esta interfaz en sus aplicaciones.

  La JNI (interfaz nativa de Java) se incluye con el Runtime Environment. Para obtener información sobre cómo utilizar la JNI, consulte el sitio Web de Sun: http://java.sun.com.

  # Configuración del Runtime Environment para Linux

  Después de instalar el Runtime Environment para Linux, edite el script de inicio de sesión del shell y añada este directorio a su sentencia PATH:

  /opt/IBMJava2-s390-141/jre/bin

  Si ha instalado el Runtime Environment para Linux en un directorio distinto de /opt/IBMJava2-s390-141/, sustituya /opt/IBMJava2-s390-141/ por el directorio en el que ha instalado el Runtime Environment para Linux.

  # Desinstalación del Runtime Environment para Linux

  El proceso que se utiliza para eliminar el Runtime Environment para Linux depende de si se ha instalado el paquete instalable Red Hat Package Manager (RPM) o el paquete comprimido Tape Archive (TAR). Consulte Desinstalación del paquete instalable Red Hat Package Manager (RPM) o Desinstalación del paquete comprimido Tape Archive (TAR) para obtener instrucciones.

  ## Desinstalación del paquete instalable Red Hat Package Manager (RPM)

  Para desinstalar el Runtime Environment para Linux si ha instalado el paquete instalable RPM:

  1. En el script de shell, escriba:

             rpm -e IBMJava2-JRE-1.4.1

     De forma alternativa puede utilizar una herramienta gráfica como kpackage o yast2.

  2. Elimine de la sentencia PATH el directorio en el que ha instalado el Runtime Environment.

  ## Desinstalación del paquete comprimido Tape Archive (TAR)

  Para desinstalar el Runtime Environment para Linux si ha instalado el paquete comprimido TAR:

  1. Elimine los archivos del Runtime Environment del directorio en el que haya instalado el Runtime Environment.

  2. Elimine de la sentencia PATH el directorio en el que ha instalado el Runtime Environment.

  # Inicio de una aplicación Java

  La herramienta java inicia una aplicación Java.

  La JVM busca la clase de arranque y otras clases utilizadas en tres pasos de localización: la classpath de la rutina de carga, las extensiones instaladas y la vía de acceso de clases del usuario. Los argumentos que van después del nombre de clase o nombre de archivo JAR se pasan a la función principal.

  El mandato javaw es idéntico a java, excepto que javaw no tiene una ventana de consola asociada. Utilice javaw si no desea que aparezca una ventana indicadora de mandatos. El iniciador javaw muestra un recuadro de diálogo con información de error si se produce una anomalía durante el inicio.

  ## Resumen de mandatos

  Los mandatos java y javaw tienen la sintaxis siguiente:

      java [ opciones ] clase [ argumentos ... ]
      java [ opciones ] -jar archivo.jar [ argumentos ... ]
      javaw [ opciones ] clase [ argumentos ... ]
      javaw [ opciones ] -jar archivo.jar [ argumentos ... ]

  Los elementos que aparecen entre corchetes son opcionales.

  opciones
    Opciones de la línea de mandatos.
  clase
    Nombre de la clase que se va a invocar.
  archivo.jar
    Nombre del archivo jar que se va a invocar. Sólo se utiliza con -jar.
  argumento
    Argumento pasado a la función main (principal).

  Si se especifica la opción -jar, el archivo JAR especificado contiene los archivos de clases y recursos de la aplicación, con la clase de arranque indicada mediante la cabecera de manifiesto Main-Class (clase principal).

  ## Opciones

  El iniciador tiene un conjunto de opciones estándar a las que el Runtime Environment da soporte actualmente y en releases futuros. Además, existe un conjunto de opciones no estándar.

  ### Opciones estándar

    -D<nombre_propiedad>=<valor>

      Establece una propiedad de sistema.

    -assert

      Imprime ayuda sobre opciones relacionadas con aserciones.

    -cp o -classpath <directorios y archivos zip o jar separados por :>

      Establece una vía de acceso para clases y recursos de aplicaciones. Si no se utilizan -classpath y -cp, y no está establecida CLASSPATH, la classpath del usuario es, por omisión, el directorio actual (.). Consulte también Trabajo con classpaths.

    -help o -?

      Imprime un mensaje de uso.

    -showversion

      Imprime la versión del producto y prosigue.

    -verbose[:class | gc | jni]

      Habilita la salida verbosa.

    -version

      Imprime la versión del producto.

    -X

      Imprime ayuda sobre las opciones no estándar.

  ### Opciones no estándar

  Las opciones -X que se listan más abajo son un subconjunto de las que están disponibles. No son estándar y están sujetas a cambios sin previo aviso.

    -Xargencoding

      Permite a las opciones del mandato java utilizar secuencias de escape Unicode para representar caracteres que no se encuentran en el juego de caracteres del entorno local. Las secuencias de escape Unicode tienen el formato \u#### donde # es un dígito hexadecimal.

    -Xbootclasspath:<directorios y archivos zip o jar separados por ;>

      Establece una vía de acceso para clases y recursos de rutina de carga. Existen otras formas de establecer bootclasspath. Consulte Trabajo con bootclasspath.|No despliegue aplicaciones que utilizan esta opción para alterar una |clase en core.jar, graphics.jar, server.jar, |security.jar, xml.jar, tools.jar o charsets.jar, |porque el despliegue podría violar la licencia de código binario de Java 2 |Runtime Environment.

    -Xbootclasspath/a:<directorios y archivos zip o jar separados por ;>

      Añade al final de la vía de acceso de clases de la rutina de carga.

    |-Xbootclasspath/p:<directorios y archivos |zip o jar separados por ;> |

      |Añade al principio de la vía de acceso de clases de la rutina de |carga. No despliegue aplicaciones que utilizan esta opción para alterar una |clase en core.jar, graphics.jar, server.jar, |security.jar, xml.jar, tools.jar o charsets.jar, |porque el despliegue podría violar la licencia de código binario de Java 2 |Runtime Environment. |

    -Xcheck:jni

      Realiza comprobaciones adicionales de las funciones JNI.

    -Xcheck:nabounds

      Realiza comprobaciones adicionales de las operaciones JNI de matriz.

    -Xdebug

      Inicia la JVM con el depurador habilitado.

    |-Xdisableexplicitgc |

      |Cambia las llamadas a System.gc() por no-ops. |

    -Xdisablejavadump

      Inhabilita el servicio de vuelco de java para terminación anormal del proceso. Cuando el vuelco de java está inhabilitado, se ejecuta el vuelco por terminación de proceso del sistema. El vuelco de java es útil cuando el problema se produce dentro del código java. Si el problema se encuentra en componentes del sistema, podría ser de mayor utilidad obtener el vuelco normal del sistema.

    |-Xgcpolicy:{optthruput | optavgpause} |

      |Especifica la configuración de la recopilación de desechos. El |valor predeterminado es optthruput. Para obtener más |información, consulte Cómo especificar una política de |recopilación de desechos. |

    -Xms<tamaño>

      Establece el tamaño inicial del almacenamiento dinámico de Java.

    -Xmx<tamaño>

      Establece el tamaño máximo del almacenamiento dinámico de Java.

    -Xnoclassgc

      Inhabilita la recopilación de desechos de clase.

    -Xoss<tamaño>

      Establece el tamaño máximo de la pila Java para cualquier hebra.

    -Xquickstart

      |Mejora el tiempo de arranque de las aplicaciones. Si no |especifica esta opción, la compilación inicial de métodos se realiza con alta |optimización (es decir, el JIT no vuelve a compilar los métodos "activos" |porque los métodos han sido compilados inicialmente con alta |optimización).

    -Xrs

      Reduce el uso de señales del sistema operativo.

    -Xrunnombre_biblioteca[:opciones]

      Carga las bibliotecas de ayuda. Para cargar varias bibliotecas, especifíquelas más de una vez en la línea de mandatos. Ejemplos de estas bibliotecas son:
      - -Xrunhprof[:help] | [:<opción>=<valor>, ...]
          Lleva a cabo una definición de perfil de almacenamiento dinámico, CPU o monitor.
      - -Xrunjdwp[:help] | [:<opción>=<valor>, ...]
          Carga bibliotecas de depuración que dan soporte a la depuración remota de aplicaciones.

    -Xss<tamaño>

      Establece un tamaño máximo de pila nativa para cualquier hebra. Para obtener más información, consulte Trabajo con pilas flotantes.

    |-Xverbosegclog:<vía de acceso del |archivo><nombre de archivo>[X, Y] |

      |Hace que la salida de verboseGC se escriba en el archivo |especificado. Si el archivo existe, se escribe encima de él. En |caso contrario, si no puede abrirse un archivo existente o no puede crearse un |nuevo archivo, la salida se redirige a stderr. Si especifica los |argumentos X e Y (ambos son enteros) la salida de verboseGC se redirige a un |número Y de archivos, conteniendo cada uno un número X de ciclos de gc de la |salida de verboseGC. Estos archivos tienen el formato |nombrearchivo1, nombrearchivo2, etc.
      |Nota:
        La variable de entorno IBM_JVM_ST_VERBOSEGC_LOG se ha eliminado en |este release. |
      |

    -Xverify

      Habilita comprobaciones más estrictas, anticipando los valores por omisión futuros.

  ## Globalización del mandato java

  El mandato java y otros mandatos del iniciador java (como javaw) permiten especificar un nombre de clase con cualquier carácter Unicode que esté en el juego de caracteres del entorno local actual.

  Puede especificar cualquier carácter Unicode en el nombre de clase y argumentos utilizando secuencias de escape java. Para hacerlo, debe especificar -Xargencoding. Para especificar un carácter Unicode, utilice secuencias de escape con el formato `\u####`, donde # es un dígito hexadecimal (0 a 9, A a F).

  Para especificar que el nombre de clase y los argumentos del mandato están en codificación UTF8 o ISO8859_1, utilice -Xargencoding:utf8 y -Xargencoding:latin.

  En el Runtime Environment, si utiliza un entorno local distinto de inglés, los mandatos java y javaw proporcionan mensajes de salida traducidos. Estos mensajes son distintos de los de la versión 1.3.1 y también varían dependiendo del entorno local en que se ejecuta Java. Las descripciones de error y otra información de depuración devuelta por java está en inglés. La información de depuración devuelta durante la instalación se muestra entre corchetes.

  ## Trabajo con classpaths

  En el Runtime Environment, puede especificar un nombre de clase como nombre de archivo completo incluida la vía de acceso completa y la extensión .class. En versiones anteriores del SDK, sólo se podía especificar la clase relativa a la CLASSPATH y no permitía la extensión .class. La utilización del nombre de archivo completo permite iniciar una aplicación java desde el escritorio o iniciador de archivos. Si especifica un archivo .class con vía de acceso y extensión, la vía de acceso especificada se sitúa dentro de la CLASSPATH. Por ejemplo, el mandato `java c:\miapli\estaapli.class` equivale a especificar `java -classpath c:\miapli estaapli`.

  ## |Cómo procesa las señales la JVM

  |Cuando se activa una señal que resulta interesante para la JVM, se llama a |un manejador de señales. Este manejador de señales determina si ha sido |llamado por una hebra Java o no Java. Si la señal es de una hebra Java, |la JVM toma el control del manejo de la señal. Si la señal es de una |hebra no Java y la aplicación que ha instalado la JVM ha instalado previamente |su propio manejador de señales, se pasa el control a ese manejador. En |caso contrario, la señal se ignora (tanto si es la acción predeterminada para |la señal como si no lo es).

  |Para señales de excepción y de error la JVM: |

  - |Maneja la condición y se recupera (cuando la excepción está causada por el |código de la aplicación), o
  - |Entra en una secuencia de conclusión controlada en la que: |
    1. |Llama al manejador de señales de la aplicación que corresponde a esa señal
    2. |Lleva a cabo la salida del volcado de la imagen de memoria para describir |el estado de la JVM en el momento de la anomalía
    3. |Llama a cualquier enganche de terminación anormal instalado por la |aplicación
    4. |Realiza la limpieza necesaria para proporcionar una conclusión limpia |
    |

  |En el caso de las señales de interrupción, la JVM también entra en una |secuencia de conclusión controlada, pero esta vez se trata como una |terminación normal que: |

  - |Llama al manejador de señales de la aplicación que corresponde a esa señal
  - |Ejecuta todos los enganches de conclusión de la aplicación
  - |Llama a cualquier enganche de salida instalado por la aplicación
  - |Realiza la limpieza necesaria de la JVM |

  |La conclusión es idéntica a la conclusión iniciada por una llamada al |método Java `System.exit()`.

  |Otras señales utilizadas por la JVM son para temas de control interno y no |hacen que termine. La única señal de control interesante es SIGQUIT, |que hace que se genere un volcado de la imagen de memoria de Java.

  ### |Señales utilizadas por la JVM

  |La Tabla 1 siguiente muestra las señales utilizadas por la JVM. |Las señales se han agrupado en la tabla por tipo o utilización, de la forma |siguiente: |

  - |Excepciones: el sistema operativo lanza de forma síncrona |una señal de excepción apropiada cada vez que se produce una condición muy |grave.
  - |Errores: la JVM lanza una SIGABRT si detecta una |condición de la que no se puede recuperar.
  - |Interrupciones: las señales de interrupción se lanzan de |forma asíncrona, desde fuera de un proceso de JVM, para solicitar la |conclusión.
  - |Controles: otras señales utilizadas por la JVM para temas |de control. |
  |

  |Tabla 1. Señales utilizadas por la JVM

  Nombre de señal | Tipo de señal | Descripción | Inhabilitada por -Xrs
  --- | --- | --- | ---
  SIGSEGV | Excepción | Acceso incorrecto a la memoria (escritura en memoria inaccesible) | No
  SIGILL | Excepción | Instrucción no permitida (intento de invocar una instrucción de máquina desconocida) | No
  SIGFPE | Excepción | Excepción de coma flotante (división por cero) | No
  SIGBUS | Excepción | Error del bus (intento de direccionar una ubicación de memoria no existente) | Sí
  SIGSYS | Excepción | Llamada al sistema emitida incorrecta | Sí
  SIGXCPU | Excepción | Superado el límite del tiempo de la CPU (ha estado en ejecución mucho tiempo) | Sí
  SIGXFSZ | Excepción | Superado el límite del tamaño de archivos | Sí
  SIGABRT | Error | Terminación anormal. La JVM lanza esta señal cada vez que detecta una anomalía en la JVM. | Sí
  SIGINT | Interrupción | Atención interactiva (Control-C). La JVM sale normalmente. | Sí
  SIGTERM | Interrupción | Petición de terminación. La JVM saldrá normalmente. | Sí
  SIGHUP | Interrupción | Cortar. La JVM sale normalmente. | Sí
  SIGUSR1 | Control | Definida por el usuario. Utilizada por algunas JVM para temas de control interno. | No
  SIGUSR2 | Control | Definida por el usuario. Utilizada por algunas JVM para temas de control interno. | No
  SIGQUIT | Control | Señal de salida para un terminal. La JVM utiliza esto para tomar volcados de la imagen de memoria de Java. | Sí
  SIGTRAP | Control | Interna para uso por dbx o ptrace. Utilizada por algunas JVM para temas de control interno. | Sí
  SIGPIPE | Control | Escritura en un conducto que no se está leyendo. La JVM ignora esto. | No

  |Utilice la opción -Xrs (reducir el uso de señales) para evitar |que la JVM utilice la mayoría de señales. Para obtener más información, |consulte la página del iniciador de aplicaciones de Java de Sun en http://java.sun.com/j2se/1.4.1/docs/tooldocs/windows/java.html.

  |Las señales `1 (SIGHUP)`, `2 (SIGINT)`, `4 |(SIGILL)`, `6 (SIGABRT)`, `7 (SIGEMT)`, `8 (SIGFPE) |`, `10 (SIGBUS)`, `11 (SIGSEGV)`, `12 (SIGSYS) |`, `15 (SIGTERM)`, y `24 (SIGXCPU)` hacen que la JVM |concluya; por lo tanto, un manejador de señales de la aplicación no |debería intentar recuperarse de estas situaciones a menos que ya no necesite |los servicios de la JVM.

  ### |Enlace de un controlador de código nativo con la biblioteca de encadenamiento de señales

  |La JVM de IBM 31-bit Runtime Environment for Linux sobre zSeries, Java 2 |Technology Edition, Versión 1.4.1 contiene un nuevo servicio de |encadenamiento de señales. El encadenamiento de señales permite a la |JVM interoperar de forma más eficaz con el código nativo que instala sus |propios manejadores de señales.

  |El servicio de encadenamiento de señales permite a la aplicación enlazar y |cargar la biblioteca compartida libjsig.so antes de |libc/libthread/libpthread. La biblioteca jsig.dll garantiza que |llamadas como `signal()`, `sigset()` y |`sigaction()` sean interceptadas para que sus manejadores no |sustituyan a los manejadores de señales de la JVM. En su lugar, estas |llamadas guardan los nuevos manejadores de señales o los "encadenan" detrás de |los manejadores instalados por la JVM. Más tarde, cuando se lance |alguna de estas señales y se determine que no está destinada a la JVM, se |invocarán los manejadores preinstalados.

  |Para utilizar libjsig.so: |

  - |Enlácela con la aplicación que crea o incorpora la JVM:

        |gcc -L <directorio de libjvm.so> -ljsig -ljvm aplicación_java.c

    |o bien

  - |Utilice la variable de entorno LD_PRELOAD:

        |export LD_PRELOAD=<libjsig.so dir>/libjsig.so; aplicación_java (ksh)
        |
        |setenv LD_PRELOAD <libjsig.so dir>/libjsig.so; aplicación_java (csh)

    |

  |Si instala manejadores de señales que utilizan `sigaction()`, |algunos sa_flags no se observan cuando la JVM utiliza la |señal. Estos son: |

  - |SA_NOCLDSTOP - Siempre sin establecer.
  - |SA_NOCLDWAIT - Siempre sin establecer.
  - |SA_RESTART - Siempre establecido.
  - |SA_ONSTACK - Siempre establecido (SIGSEGV sólo). |

  |La biblioteca libjsig.so siempre oculta también los manejadores de |señales de la JVM de la aplicación. Por lo tanto, llamadas como |`signal()`, `sigset()` y `sigaction()` realizadas |después de iniciarse la JVM ya no devuelven una referencia al manejador de |señales de la JVM y en su lugar devuelven cualquier manejador que haya sido |instalado antes del inicio de la JVM.

  ## Trabajo con bootclasspath

  Puede establecer la propiedad del sistema ibm.jvm.bootclasspath mediante la opción -D descrita en Inicio de una aplicación Java. El valor de esta propiedad se utiliza como vía de acceso de búsqueda adicional, insertándose entre un valor definido por -Xbootclasspath/p: y la classpath de la rutina de carga. La classpath de la rutina de carga es el valor por omisión o bien la definida mediante la opción -Xbootclasspath:.

  ## Cómo especificar una política de recopilación de desechos

  La opción -Xgcpolicy de ejecución de la JVM especifica la política de recopilación de desechos.

  -Xgcpolicy acepta dos valores, optthruput (el valor por omisión) y optavgpause. La opción controla el comportamiento del recopilador de desechos, realizando intercambios entre la salida de la aplicación y el sistema en general y los tiempos de pausa provocados por la recopilación de desechos.

  El formato de la opción y sus valores son:

  > -Xgcpolicy:optthruput

  y

  > -Xgcpolicy:optavgpause

  ### Tiempo de pausa

  Cuando un intento de una aplicación de crear un objeto no se puede cumplir inmediatamente con el espacio disponible en el almacenamiento dinámico, corresponde al recopilador de desechos identificar los objetos sin referencia (desechos), suprimirlos y devolver el almacenamiento dinámico a un estado en el que las peticiones de asignación inmediatas y posteriores se puedan satisfacer rápidamente. Estos ciclos de recopilación de desechos provocan pausas inesperadas ocasionales en la ejecución del código de la aplicación. Como el tamaño y la complejidad de las aplicaciones aumenta y los almacenamientos dinámicos crecen en consecuencia, este tiempo de pausa de recopilación de desechos tiende a aumentar en duración e importancia. El valor por omisión de la recopilación de desechos, optthruput, proporciona una salida muy alta para las aplicaciones, pero al coste de estas pausas ocasionales, que pueden variar de unos pocos milisegundos a varios segundos, en función del tamaño del almacenamiento dinámico y la cantidad de desechos.

  ### Reducción del tiempo de pausa

  La opción optavgpause reduce substancialmente el tiempo invertido en estas pausas de recopilación de desechos, además de limitar el efecto de incremento del tamaño del almacenamiento dinámico en la duración de la pausa de recopilación de desechos. Esta opción tiene una importancia especial en configuraciones con almacenamientos dinámicos grandes. Los tiempos de pausa se reducen realizando algunas actividades de recopilación de desechos que son concurrentes con la ejecución normal del programa. Con el tiempo de pausa reducido, puede experimentarse alguna reducción en la salida de la aplicación que varía de una aplicación a otra.

  ### Entornos con almacenamientos dinámicos muy llenos

  Si el almacenamiento dinámico de Java está casi lleno y hay muy pocos desechos que recopilar, es posible que las peticiones de objetos nuevos no se puedan satisfacer rápidamente ya que no hay espacio disponible inmediatamente. Si se trabaja con un almacenamiento dinámico casi lleno, el rendimiento de las aplicaciones puede resentirse sin importar cuál de las opciones anteriores se usa y, si se siguen realizando peticiones de más espacio de almacenamiento dinámico, la aplicación recibe una excepción OutofMemory, que provoca la interrupción de la JVM si esta excepción no se detecta y gestiona. En estas condiciones, se recomienda incrementar el tamaño del almacenamiento dinámico mediante la opción -Xmx o reducir el número de objetos de aplicación en uso.

  ### Información adicional sobre la recopilación de desechos

  Para obtener información más detallada sobre la recopilación de desechos, consulte:

  http://www.ibm.com/developerworks/ibm/library/i-garbage1/

  http://www.ibm.com/developerworks/ibm/library/i-garbage2/

  http://www.ibm.com/developerworks/ibm/library/i-garbage3/

  |Para obtener información sobre el manejo de pérdidas de memoria en |una aplicación Java, consulte: http://www.ibm.com/developerworks/library/j-leaks/index.html |.

  # Obtención del número de versión y de nivel de compilación de IBM

  Para obtener el número de versión y de nivel de compilación de IBM, en el indicador de shell escriba:

  `java -version`

  # Trabajo con pilas flotantes

  En un sistema Linux de pilas no flotantes, independientemente de lo que se establezca para -Xss, se proporciona un tamaño mínimo de pilas nativas de 256 KB para cada hebra. En un sistema Linux de pilas flotantes, se respetan los valores de -Xss. Por lo tanto, si realiza la migración de un sistema Linux sin pilas flotantes, debe asegurar que los valores de -Xss son lo bastante grandes y que no se basan en el mínimo de 256 KB.

  # Conmutación del método de entrada en idiomas DBCS

  En sistemas DBCS (juego de caracteres de doble byte), si desea conmutar el método de entrada, deberá utilizar la clase java.util.prefs.Preferences en lugar de las variables de entorno IBMJAVA_INPUTMETHOD_SWITCHKEY y IBMJAVA_INPUTMETHOD_SWITCHKEY_MODIFIERS. Consulte Sun's Input Method Framework Specification en detalle.

  # Ejemplo del Runtime

  El sitio Web de Sun, http://java.sun.com, contiene el ejemplo "Hello World" disponible para poder bajarse. El ejemplo muestra cómo crear una aplicación Java sencilla que se ejecuta en el Runtime Environment.

  # Instalación de la aplicación en un sistema de usuario

  Tras desarrollar su producto y una vez listo para enviarlo, tiene que instalar el producto en un sistema de usuario, configurar el sistema de usuario para que dé soporte al software y configurar el entorno de ejecución.

  Si utiliza el Runtime Environment para Linux, deberá asegurarse de que el procedimiento de instalación no escriba encima de ninguna instalación existente (a menos que la versión existente del Runtime Environment para Linux sea una versión antigua).

  Para redistribuir el Runtime Environment para Linux, puede instalarlo en su propio sistema, a continuación copie los archivos necesarios del Runtime Environment en su conjunto de instalación. Si elige esta opción, deberá incluir todos los archivos que se suministran con el Runtime Environment para Linux. El software Runtime Environment para Linux sólo se puede redistribuir si se incluyen todos los archivos. En efecto, cuando envía su aplicación, ésta tendrá su propia copia del Runtime Environment para Linux.

  Para obtener información concreta acerca de los archivos que se deben redistribuir, consulte el acuerdo de licencia que acompaña a este producto.

  # Limitaciones conocidas

  Los apartados siguientes explican las limitaciones conocidas del SDK para Linux.

  - |Si durante la ejecución utiliza gran cantidad de hebras |concurrentes, puede aparecer un mensaje de aviso: |`java.lang.OutOfMemoryError`. Esto indica que la |máquina se queda sin recursos del sistema y los mensajes pueden venir |provocados por las razones siguientes: |
    1. |No pueden crearse nuevas hebras porque: |
       - |El número de procesos creados supera el límite del usuario.
         |

         |

       - |No hay recursos del sistema suficientes para crear nuevas hebras. |En este caso, podrían aparecer también otras excepciones Java, dependiendo |sobre qué se esté ejecutando la aplicación. |
       |

       |

    2. |Se agota la memoria del kernel o está fragmentada. Puede ver los |mensajes correspondientes de Memoria agotada del kernel en /var/log/messages |que tiene el ID de proceso en que se ha ejecutado kill.
       |

       |

    Intente ajustar el sistema para aumentar los recursos del sistema |correspondientes.
    |
  - Durante la instalación, si ya ha instalado una versión anterior de este producto distribuido por Red Hat, Red Hat Package Manager (RPM) informará que el paquete de IBM es más antiguo que cualquiera de las versiones del producto distribuidas por Red Hat. Esta situación se produce porque Red Hat añade un "número de serie" al paquete de RPM que altera el esquema de versiones del producto en el paquete y, por omisión, RPM rechaza instalar un paquete que parece ser más antiguo que el que ya está instalado. La opción --oldpackage del mandato rpm le permite instalar el nuevo paquete de IBM.

  - Si utiliza audio en una máquina sin una tarjeta de sonido, puede producirse un mensaje de error que indica que no hay memoria cuando Java intenta reproducir un sonido. El mensaje se muestra en la consola, pero no afecta a la aplicación Java.

  - Es posible que no pueda utilizar el portapapeles del sistema con juegos de caracteres de doble byte (DBCS) para copiar información entre las aplicaciones Linux y Java si está ejecutando K Desktop Environment (KDE).

  - El SDK para Linux implementa las hebras Java como hebras nativas, lo que representa que en cada hebra hay un proceso Linux independiente. Si el número de hebras Java sobrepasa el número máximo de procesos permitidos, puede que el programa reciba un mensaje de error, un error SIGSEGV o que se cuelgue.

    El número máximo de hebras disponibles está determinado por el valor mínimo de:

    - El valor de procesos del usuario (ulimit -u) en /etc/security/limits.conf
    - |El límite que está definido en /proc/sys/kernel/threads_max
    - El límite PTHREAD_THREADS_MAX definido en libpthreads.so (cambiarlo requiere volver a compilar el kernel de Linux)

    Sin embargo, puede que agote el almacenamiento virtual antes de llegar al número máximo de hebras.

  - Si termina una aplicación Java con Control-C, es posible que algunos procesos queden huérfanos.

  - El programa javap, cuando se ejecuta en una interfaz, duplica la serie "interface" en el resultado. Por ejemplo, si ejecuta javap en "java.lang.Runnable" se produce:

        public interface interface java.lang.Runnable extends java.lang.Object...

  - Intentar visualizar los recuadros de diálogo creados mediante Swing puede provocar un retraso de unos pocos segundos antes de que aparezcan en la ventana.

  - Los resultados de KeyEvent que incluyan la tecla ALT son diferentes cuando se utilizan administradores de ventanas distintos en Linux. También serán diferentes de los resultados obtenidos en otros sistemas operativos. En el administrador de ventanas Enlightenment, Alt+A y Mayús+Alt+A generan modificadores distintos y Control+Alt+A no genera ningún suceso de teclas. Sin embargo, si se utiliza el administrador de ventanas WindowMaker, Control+Alt+A genera un suceso de teclas.

  - En el sistema X Window de Linux, la correlación de teclado está establecida en: 64 0xffe9 (Alt_L) 0xffe7 (Meta_L) y 113 0xffea (Alt_R) 0xffe8 (Meta_R). Puede comprobarlo escribiendo lo siguiente en el indicador de shell:

        xmodmap -pk

    Este es el motivo por el cual el SDK para Linux considera que se ha pulsado Meta + Alt simultáneamente. Como solución provisional, puede eliminar la correlación Meta_x escribiendo lo siguiente en el indicador de shell:

        xmodmap -e "keysym Alt_L = Alt_L" -e "keysym Alt_R = Alt_R"

    Nota:
      Esta solución provisional puede afectar a otras aplicaciones X-Window que se ejecuten en la misma pantalla si utilizan la misma Meta-tecla que se ha eliminado.

  - La creación de pares de claves DSA de longitudes inusuales puede llevar una cantidad de tiempo importante en máquina lentas. El retardo no debe interpretarse como que se ha colgado porque el proceso se completará si se le deja el tiempo suficiente. El algoritmo de generación de claves DSA se ha optimizado para generar longitudes de claves estándar (por ejemplo, 512, 1024) más rápidamente que otras.

  - |Se han eliminado la mayoría de las limitaciones de NIO (nueva E/S) |de la v1.4.0. Sólo se mantienen las limitaciones |siguientes:
    |

    |Tabla 2. Limitaciones de la nueva E/S

    Número de error de Sun | Breve descripción de la limitación
    --- | ---
    4696508 | Selector no sincroniza como se ha especificado

    |

  - Los programas nativos no pueden crear una JVM 1.1. No es posible llamar a JNI_CreateJavaVM() y pasar una versión de JNI_VERSION_1_1(0x00010001). Las versiones que se pueden pasar son:
    - JNI_VERSION_1_2(0x00010002)
    - JNI_VERSION_1_4(0x00010004)

    |La JVM creada en cualquier caso es la especificada por las |bibliotecas (es decir, 1.2.2, 1.3.x, |1.4.x), no la indicada por la interfaz JNI. La API de la |interfaz no afecta a la especificación del idioma implementado por la JVM, las |API de bibliotecas de clases o cualquier otra área del comportamiento de la |JVM. La API de la interfaz sólo especifica cómo el código nativo puede |invocar el comportamiento necesario.

  - Aunque el kernel de Linux de las distribuciones actuales proporciona soporte para el protocolo de Internet versión 6 (IP6), puede encontrarse con problemas al utilizarlo. El soporte de IP6 por parte de Java está incluido en este release, pero se recomienda desactivar el soporte con la opción -Djava.net.preferIPv4Stack=true del mandato Java. Si instala un kernel que soporte completamente IP6, no necesita esta opción.

  Las limitaciones siguientes sólo afectan a los usuarios de chino tradicional.

  - Las teclas de función Intro, Espacio, Retroceso y Escape no funcionan como se espera cuando se utilizan los IME LinYi ZhuYin, YiTian ZhuYin y Bosham para la entrada de caracteres TCH. La tecla Intro inserta una nueva línea, la tecla Escape se utiliza para cancelar las series editadas previamente o la ventana candidata, y la Barra espaciadora inserta un espacio. La ventana candidata deberá desaparecer después de pulsar la tecla consignada y no deberá aparecer al pulsar la tecla Retroceso mientras se utilizan los IME LinYi ZhuYin, YiTian ZhuYin y Bosham para la entrada de caracteres chinos tradicionales.

  # Avisos

  Esta información se ha desarrollado para productos y servicios que se ofrecen en los EE.UU. IBM puede que no ofrezca los productos, servicios o características que se discuten en este documento en otros países. Consulte a su representante local de IBM para obtener información acerca de los productos y servicios actualmente disponibles en su zona. Cualquier referencia a un producto, programa o servicio de IBM no pretende afirmar ni implica que sólo se pueda utilizar dicho producto, programa o servicio de IBM. En su lugar, puede utilizarse cualquier producto, programa o servicio funcionalmente equivalente que no infrinja ninguno de los derechos de propiedad intelectual de IBM. Sin embargo, la evaluación y la verificación del funcionamiento conjuntamente con otros productos, programas o servicios que no son de IBM es responsabilidad del usuario.

  IBM puede tener aplicaciones patentadas o pendientes de patente que cubran el tema tratado en este documento. La posesión de este documento no le otorga ninguna licencia sobre estas patentes. Puede enviar consultas de licencias por escrito a la dirección siguiente:

  - IBM Director of Licensing
    IBM Corporation
    North Castle Drive, Armonk
    NY 10504-1758 U.S.A.

  Para consultas de licencias relacionadas con la información de doble byte (DBCS), póngase en contacto con el Departamento de la propiedad intelectual de IBM de su país o envíe las consultas por escrito a la dirección siguiente:

  - IBM World Trade Asia Corporation Licensing
    2-31 Roppongi 3-chome, Minato-ku
    Tokyo 106-0032, Japan

  El párrafo siguiente no se aplica al Reino Unido ni a cualquier otro país en el que tales disposiciones sean incoherentes con la legislación nacional:

  INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA ESTA PUBLICACIÓN "TAL CUAL" SIN GARANTÍA DE NINGUNA CLASE, YA SEA EXPLICITA O IMPLÍCITA, INCLUIDAS, PERO SIN LIMITARSE A ELLAS, LAS GARANTÍAS IMPLÍCITAS DE NO VULNERACIÓN, COMERCIALIZACIÓN O IDONEIDAD PARA UN PROPÓSITO DETERMINADO. Algunos estados no contemplan la limitación de responsabilidades, ni implícitas ni explícitas, en determinadas transacciones, por lo que cabe la posibilidad de que esta declaración no sea aplicable en su caso.

  Esta información puede contener imprecisiones técnicas o errores tipográficos. Periódicamente se realizarán modificaciones en la información aquí contenida; dichos cambios se incorporarán en nuevas ediciones de la publicación. IBM puede efectuar mejoras y/o cambios en los productos y/o programas descritos en esta información en cualquier momento y sin previo aviso.

  Cualquier referencia hecha en esta información a sitios Web que no son de IBM se proporciona únicamente para su comodidad y no debe considerarse en modo alguno como promoción de dichos sitios Web. Los materiales de estos sitios Web no forman parte de los materiales de IBM para este producto y el uso que se haga de estos sitios Web es de la entera responsabilidad del usuario.

  IBM puede utilizar o distribuir la información que facilite de la manera que considere apropiada sin incurrir en obligaciones con el remitente.

  Los poseedores de la licencia de este programa que deseen obtener información acerca del mismo con el propósito de permitir (i) el intercambio de información entre programas creados independientemente y otros programas (incluido éste) y (ii) la utilización mutua de la información intercambiada, deben ponerse en contacto con la dirección siguiente:

  - JIMMAIL@uk.ibm.com
    [Contacto de Hursley Java Technology Center (JTC)]

  Esta información estará disponible, sujeta a los términos que correspondan, lo que en algunos casos incluirá el pago de una cuota.

  IBM proporciona el programa con licencia descrito en este documento y todo el material con licencia disponible para el mismo bajo los términos del Acuerdo de cliente de IBM, el Acuerdo internacional de licencia de programas IBM o cualquier acuerdo equivalente entre las dos partes.

  Cualquier información acerca del rendimiento que contenga el presente documento se ha determinado en un entorno controlado. Por lo tanto, los resultados obtenidos en otros entornos operativos pueden variar significativamente. Es posible que algunas medidas se hayan tomado en sistemas de nivel de desarrollo y no hay garantías de que estas medidas serán iguales en los sistemas habitualmente disponibles. Asimismo, algunas mediciones pueden haber sido estimadas mediante la extrapolación. Los resultados reales pueden variar. Los usuarios de este documento deben verificar los datos aplicables para su entorno específico.

  La información relativa a productos que no son de IBM se ha obtenido de los proveedores de estos productos, de los anuncios públicos o de otras fuentes disponibles públicamente. IBM no ha probado esos productos y no puede confirmar la precisión del rendimiento, su compatibilidad o cualquier otra afirmación relacionada con productos que no son de IBM. Las preguntas sobre las posibilidades de los productos que no son de IBM deben dirigirse a los proveedores de dichos productos.

  ## Marcas registradas

  IBM y zSeries son marcas registradas de International Business Machines Corporation en los Estados Unidos y/o en otros países.

  Java y todas las marcas y logotipos basados en Java son marcas comerciales o marcas registradas de Sun Microsystems, Inc. en los Estados Unidos y/o en otros países.

  Otros nombres de empresas, productos o servicios pueden ser marcas registradas o de servicio de otros.

  Este producto incluye software desarrollado por Apache Software Foundation http://www.apache.org/.