# IBM Runtime Environment for Linux sobre arquitectura AMD64, Java 2 Technology Edition, versión 1.4.2

# Guía del usuario del Runtime Environment

# 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 corresponde a IBM Runtime Environment for Linux sobre arquitectura AMD64, Java 2 Technology Edition, versión 1.4.2.

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

(c) Copyright International Business Machines Corporation, 1999, 2004. 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

Esta Guía del usuario describe el IBM(R) Runtime Environment for Linux(TM) sobre arquitectura AMD64.

El IBM Runtime Environment contiene la Java(TM) 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.

La guía IBM JVM Diagnostics Guide proporciona información más detallada sobre IBM JVM.

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 SDK incluye el Runtime Environment para Linux, que 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.

# Contenido

Información de copyright
Prefacio
Visión general
Archivos incluidos con el Runtime Environment para Linux
Acuerdo de licencia
Compilador just-in-time (JIT)
Interfaz nativa e interfaz de métodos nativa de Java
Configuración de Runtime Environment
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 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
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
Implementación de la agrupación de manejadores de conexiones para RMI
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
Instalación de la aplicación en un sistema de usuario
Limitaciones conocidas
Comentarios sobre esta Guía del usuario
Avisos
Marcas registradas

# Visión general

El Runtime Environment contiene la JVM (Máquina Virtual Java), clases Java y archivos de soporte. El Runtime Environment contiene solamente un subconjunto de las clases incluidas en el SDK y le permite ejecutar clases Java pero no compilar programas Java.

## Archivos incluidos con el Runtime Environment para Linux

El Runtime Environment para Linux incluye archivos de objetos binarios y 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 el compilador de Java (javac), ni clases que pudieran pertenecer sólo a un sistema de desarrollo.

Además, el paquete de la interfaz de programas de aplicación (API) Java Communications se proporciona para su uso con el Runtime Environment para Linux. Si ha instalado la API Java Communications, puede encontrar información acerca de ésta en la guía JavaComm API User Guide.

## 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.

Runtime Environment para Linux incluye el 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 JIT, utilice la opción -Xint. En la ventana del indicador de del shell donde se ejecuta la aplicación, escriba:

        java -Xint class

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)

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

    (JIT disabled)

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

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/j2se/1.4.2/docs/guide/jni.

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

# Configuración de Runtime Environment

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

/opt/IBMJava2-142/jre/bin

Si ha instalado el Runtime Environment en un directorio que no sea /opt/IBMJava2-142/, sustituya /opt/IBMJava2-142/ por el directorio en el que ha instalado el Runtime Environment.

# Desinstalación del Runtime Environment para Linux

El proceso que puede utilizar 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.2-0.0

   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. Requiere como parámetro un nombre de clase inicial Java. Si no lo proporciona, se imprimirá un mensaje de uso.

La JVM busca la clase inicial además de otras que se utilizan en tres conjuntos de ubicaciones: la classpath de rutina de carga, las extensiones instaladas y la classpath de 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 la vía de acceso para clases y recursos de aplicación. 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 | dynload | stack | debug | sizes | stackwalk]
  - 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 enumeradas a continuación son no estándar y están sujetas a cambios sin previo aviso.

- -Xargencoding
  - Le permite incluir secuencias de escape Unicode en la lista de argumentos.
- -Xbootclasspath:<directorios y archivos zip o jar separados por ;>
  - Establece la vía de acceso de búsqueda para clases y recursos de rutina de carga.
- -Xbootclasspath/a:<directorios y archivos zip o jar separados por ;>
  - Anexa los directorios y archivos zip o jar especificados al final de la classpath de rutina de carga.
- -Xbootclasspath/p:<directorios y archivos zip o jar separados por ;>
  - Añade los directorios y archivos zip o jar especificados al principio de la classpath de rutina de carga. No despliegue aplicaciones que utilizan la opción -Xbootclasspath: o -Xbootclasspath/p: 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. También puede utilizar -Xrunjnichk.
- -Xcheck:nabounds
  - Realiza comprobaciones adicionales de las operaciones JNI de matriz. También puede utilizar -Xrunjnichk.
- -Xcompactexplicitgc
  - Realiza la compactación a cada llamada a `System.gc()`. Vea también -Xnocompactexplicitgc
- -Xcompactgc
  - Compacta todo el ciclo de recolección de desechos. Vea también -Xnocompactgc
- -Xdbg:<opciones>
  - Carga bibliotecas de depuración que dan soporte a la depuración remota de aplicaciones. Esto es lo mismo que -Xrunjdwp
- -Xdbginfo:< vía de acceso al archivo de símbolos>
  - Carga y pasa opciones al servidor de información de depuración.
- -Xdisablejavadump
  - Provoca que se generen volcados del sistema en lugar de javadumps cuando se producen errores.
- -Xdebug
  - Inicia la JVM con el depurador habilitado.
- -Xdisableexplicitgc
  - Cambia las llamadas a `System.gc()` por no-ops.
- -Xfuture
  - Activa comprobaciones rigurosas de formato de archivo de clases. Utilice este distintivo si desarrolla código nuevo porque las comprobaciones más rigurosas pasarán a ser los valores por omisión en futuros releases del iniciador de aplicaciones Java.
- -Xgc:<opciones>
  - Pasa opciones como verbose, compact, nocompact, etc. al recolector de desechos.
- -Xgcpolicy:[:optthruput]|[:optavgpause]
  - Controla el comportamiento del recolector de desechos. La opción optthruput es el valor por omisión y entrega un volumen muy alto de salida a las aplicaciones, pero a costa de pausas esporádicas. La opción optavgpause reduce el tiempo invertido en estas pausas de recopilación de desechos y limita el efecto de incremento del tamaño del almacenamiento dinámico en la duración de la pausa de recopilación de desechos. Utilice optavgpause si la configuración tiene un almacenamiento dinámico de gran tamaño.
- -Xgcthreads<número de hebras>
  - Establece el número de hebras que deben realizar la recopilación de desechos.
- -Xinitsh<tamaño>
  - Establece el tamaño inicial de almacenamiento designado a contener clases del sistema.
- -Xint
  - Hace que la JVM utilice el Intérprete sólo, inhabilitando JIT y AOT.
- -Xiss
  - Establece el tamaño inicial de la pila de almacenamiento dinámico de Java.
- -Xjit[:<número de hebras>]
  - Habilita JIT o pasa opciones a éste, o bien, las dos cosas. Consulte también -Xnojit.
- -Xlinenumbers
  - Habilita los números de línea para depuración. Consulte también -Xnolinenumbers.
- -Xmaxe<tamaño>
  - Establece la cantidad máxima en la que el recolector de desechos amplía el almacenamiento dinámico. Corrientemente, el recolector de desechos amplía el almacenamiento dinámico cuando la cantidad de espacio libre cae por debajo del 30% (o en la cantidad especificada utilizando -Xminf), con la cantidad necesaria para restaurar el espacio libre al 30%. La opción -Xmaxe limita la ampliación al valor especificado; por ejemplo `-Xmaxe10M` limita la ampliación a 10 MB.
- -Xmaxf<tamaño>
  - Especifica el porcentaje máximo de almacenamiento dinámico que debe estar libre después de una recopilación de desechos. Si el espacio libre supera esta cantidad, la JVM intentará mermar el almacenamiento dinámico. Especifique el tamaño como un número decimal en el intervalo de 0 a 1, por ejemplo `-Xmaxf0.5` establece el espacio máximo libre en el 50%. El valor por omisión es 0.6.
- -Xmca<tamaño>
  - Establece el segmento de clase RAM en el incremento del tamaño especificado.
- -Xmco<tamaño>
  - Establece el segmento de clase ROM en el incremento del tamaño especificado.
- -Xmine<tamaño>
  - Establece la cantidad mínima en la que el recolector de desechos amplía el almacenamiento dinámico. Corrientemente, el recolector de desechos amplía el almacenamiento dinámico en la cantidad necesaria para restaurar el espacio libre al 30% (o en la cantidad especificada utilizando -Xminf). La opción -Xmine establece la ampliación en el mínimo con el valor especificado; por ejemplo, `-Xmine50M` establece el tamaño de ampliación a un mínimo de 50 MB.
- -Xminf<tamaño>
  - Especifica el porcentaje mínimo de almacenamiento dinámico que debe estar libre después de una recopilación de desechos. Si el espacio libre cae por debajo de esta cantidad, la JVM intentará ampliar el almacenamiento dinámico. Especifique el tamaño como un número decimal en el intervalo de 0 a 1; por ejemplo `-Xminf0.3` solicita que el espacio mínimo libre sea el 30 % del almacenamiento dinámico.
- -Xmjit[:<número de hebras>]
  - Habilita MicroJIT o pasa opciones a éste, o bien, las dos cosas.
- -Xmn<tamaño>
  - Establece el tamaño del almacenamiento dinámico nuevo en el tamaño especificado.
- -Xmo<tamaño>
  - Establece el tamaño inicial del almacenamiento dinámico de Java. También puede utilizar -Xms.
- -Xmoi<tamaño>
  - Incrementa el tamaño inicial del almacenamiento dinámico de Java.
- -Xmr<tamaño>
  - Establece el tamaño recordado establecido.
- -Xms<tamaño>
  - Establece el tamaño inicial del almacenamiento dinámico de Java. También puede utilizar -Xmo.
- -Xmso<tamaño>
  - Establece el tamaño de la pila de hebras de OS.
- -Xmx<tamaño>
  - Establece el tamaño máximo del almacenamiento dinámico de Java.
- -Xnm
  - Especifica el tamaño de agrupación de monitores.
- -Xnoagent
  - Inhabilita la interfaz de sun.tools.debug antigua, para que pueda utilizar el soporte de depuración de JPDA.
- -Xnoaot
  - Inhabilita el AOT.
- -Xnoclassgc
  - Inhabilita la recopilación de desechos de clase. Esto desconecta la recopilación de desechos de almacenamiento asociada a clases Java que la JVM ya no va a utilizar.
- -Xnocompactgc
  - Inhabilita la compactación del recolector de desechos. Consulte también -Xcompactgc.
- -Xnocompactexplicitgc
  - Inhabilita la compactación en llamadas a `System.gc()`. Consulte también -Xcompactexplicitgc
- -Xnojit
  - Inhabilita el JIT. Consulte también -xjit.
- -Xnolinenumbers
  - Inhabilita los números de línea para depuración. Consulte también -Xlinenumbers.
- -Xnopartialcompactgc
  - Inhabilita la compactación incremental en llamadas a `System.gc()`. Consulte también -Xpartialcompactgc
- -Xnosigcatch
  - Inhabilita el código de recuperación de la JVM. Consulte también -Xsigcatch.
- -Xnosigchain
  - Inhabilita el encadenamiento de manejadores de señales. Consulte también -Xsigchain.
- -Xoptionsfile=<archivo>
  - Especifica un archivo que contiene opciones de la JVM y definiciones.
- -Xoss<tamaño>
  - Establece el tamaño máximo de la pila Java para cualquier hebra.
- -Xpartialcompactgc
  - Hailita la compactación incremental en todas las llamadas a `System.gc()`. Consulte también -Xnopartialcompactgc
- -Xquickstart
  - Mejora el tiempo de inicio retardando la compilación.
- -Xrdbginfo:<sistema principal>:<puerto>
  - Carga y pasa opciones al servidor de información de depuración remoto.
- -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. Esto es lo mismo que -Xdbg
    - -Xrunjnichk[ :verbose | trace | profile | nonfatal | nowarn | noadvice | pedantic | help]
      - Realiza comprobaciones adicionales de las funciones JNI.
- -Xsigcatch
  - Habilita el código de recuperación de la JVM. Consulte también -Xnosigcatch
- -Xsigchain
  - Habilita el encadenamiento de manejadores de señales. Consulte también -Xnosigchain.
- -XsigquitToFile<vía de acceso al archivo><nombrearchivo>
  - Vuelca la información del rastreo sigquit al archivo especificado.
- -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.
- -Xthr:<opciones>
  - Establece las opciones de hebras.
- -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 X de archivos, conteniendo cada uno un número Y de ciclos de gc (recopilación de desechos) de la salida de verboseGC. Estos archivos tienen el formato nombrearchivo1, nombrearchivo2, etc.
- -Xverify
  - Habilita la comprobación rigurosa de clases para cada clase que se cargue.
- -Xverify:none
  - Inhabilita la comprobación rigurosa de clases.

## 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.

También 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).

De modo alternativo, para especificar que el nombre de clase y los argumentos del mandato están en código UTF8, utilice -Xargencoding:utf8, o bien, en código ISO8859_1 utilice -Xargencoding:latin.

Los mandatos java y javaw proporcionan mensajes de salida traducidos. Estos mensajes difieren según el entorno local en que se ejecute Java. Las descripciones de error detalladas y otra información de depuración devuelta por java está en inglés.

## Trabajo con classpaths

Para especificar un nombre de clase con el nombre de archivo completo, incluya la vía de acceso completa y la extensión .class. En versiones anteriores, podía especificar sólo la clase que era relativa a la CLASSPATH y no se 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 ~/miapli/estaapli.class` equivale a especificar `java -classpath ~/miapli estaapli`.

## 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 toma los valores optthruput (el valor por omisión), optavgpause o gencon. 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

> -Xgcpolicy:optavgpause

> -Xgcpolicy:gencon

### 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 JVM utiliza dos técnicas para reducir los tiempos de pausa:

- Recopilación de desechos simultánea
- Recopilación de desechos generacional

La opción de línea de mandatos -Xgcpolicy:optavgpause solicita el uso de la recopilación de desechos simultánea para reducir notablemente el tiempo invertido en las pausas de recopilación de desechos. La recopilación de desechos simultánea reduce el tiempo de pausa realizando algunas actividades de recopilación de desechos durante la ejecución normal del programa para minimizar los trastornos provocados por la recopilación del almacenamiento dinámico. La opción -Xgcpolicy:optavgpause también limita el efecto de aumento de tamaño de almacenamiento dinámico en lo que dura la pausa de recopilación de desechos. La opción -Xgcpolicy:optavgpause resulta de mayor utilidad para configuraciones que tienen grandes almacenamientos dinámicos. Con el tiempo de pausa reducido, podría experimentar alguna reducción de la salida a las aplicaciones.

Durante la recopilación de desechos simultánea se invierte una cantidad de tiempo considerable en identificar los objetos de una relativa larga duración que no se pueden recopilar. Si la recopilación de desechos se centra en objetos que muy probablemente sean reciclables, puede reducir aún más los tiempos de pausa de algunas aplicaciones. La recopilación de desechos generacional consigue ésto dividiendo el almacenamiento dinámico en dos "generaciones", las áreas: "guardería" y "permanente". Los objetos se colocan en una de estas áreas en función de su antigüedad. La guardería es la más pequeña de las dos y contiene objetos con menos antigüedad; el área permanente es mayor y contiene objetos con más antigüedad. Primero se asignan los objetos a la guardería; si duran lo suficiente el sistema solicita pasarlos finalmente al área permanente.

La recopilación de desechos generacional depende de la mayoría de los objetos que no duran mucho. Este tipo de recopilación reduce los tiempos de pausa centrando el esfuerzo para recuperar el almacenamiento en la guardería porque tiene el espacio más reciclable. En lugar de utilizar tiempos de pausa esporádicos pero prolongados para recopilar el almacenamiento dinámico completo, se recopila con más frecuencia la guardería y, si dicho ésta es lo suficientemente pequeña, los tiempos de pausa son comparativamente breves. No obstante, la recopilación de desechos generacional tiene el inconveniente de que con el tiempo podría llenarse el área permanente si hay demasiados objetos de larga duración. Para minimizar el tiempo de pausa cuando se produce esta situación, utilice una combinación de las recopilaciones de desechos simultánea y generacional. La opción -Xgcpolicy:gencon solicita el uso combinado de la recopilación de desechos simultánea y generacional para ayudar a minimizar el tiempo que se invierte en las pausas de recopilación de desechos.

### 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 este punto, la JVM producirá un archivo de diagnóstico "javadump". 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.

# 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 se instala un manejador de aplicaciones para este señal y no se ha especificado la opción de línea de mandatos -Xnosigchain, después de que la JVM ha terminado el proceso, se llamará al manejador de aplicaciones para esta 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 otro caso, si la JVM o la aplicación Java solicitan la señal, o bien, se ignora la señal o se lleva a cabo la acción por omisión.

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

- Maneja la condición y se recupera, o bien,
- Entra en una secuencia de conclusión controlada en la que:
  1. Lleva a cabo la salida de un Javadump para describir el estado de la JVM en el momento de la anomalía
  2. Llama al manejador de señales de la aplicación que corresponde a esa señal
  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

Para obtener información sobre cómo escribir un iniciador que especifique los enganches anteriores, consulte: http://www-106.ibm.com/developerworks/java/library/i-signalhandling/. Este artículo se ha escrito para Java V1.3.1, pero también se aplica a versiones posteriores.

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 Javadump.

## Señales utilizadas por la JVM

La Tabla 1 siguiente muestra las señales utilizadas por la JVM. Las señales se agrupan 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
--- | --- | --- | ---
SIGBUS | Excepción | Acceso incorrecto a memoria (mal alineación de los datos) | No
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
SIGABRT | Error | Terminación anormal. La JVM lanza esta señal cada vez que detecta una anomalía en la JVM. | No
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í
SIGQUIT | Control | Señal de salida para un terminal. La JVM utiliza esto para aceptar Javadumps. | No
SIGPIPE | Control | Conducto roto. Establézcalo en SIG_IGN | No

Utilice la opción -Xrs (reducir el uso de señales) para evitar que la JVM maneje 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.2/docs/tooldocs/windows/java.html.

Las señales `1 (SIGHUP)`, `2 (SIGINT)`, `4 (SIGILL)`, `7 (SIGBUS)`, `8 (SIGFPE)`, `11 (SIGSEGV)` y `15 (SIGTERM)` en hebras de JVM provocan que concluya la JVM; 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

El Runtime Environment contiene un 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 encadenamiento de señales permite a la aplicación enlazar y cargar la biblioteca compartida libjsig.so antes que las bibliotecas del sistema. La biblioteca libjsig.so 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$JAVA_HOME/bin -ljsig -L$JAVA_HOME/bin/j9vm -ljvm aplicación_java.c

  o bien
- Utilice la variable de entorno LD_PRELOAD:

      export LD_PRELOAD=$JAVA_HOME/bin/libjsig.so; aplicación_java (bash y ksh)

      setenv LD_PRELOAD=$JAVA_HOME/bin/libjsig.so; aplicación_java (csh)

  (Asumiendo que `JAVA_HOME` esté configurada; en caso contrario, utilice /opt/IBMJava2-142/jre.)

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.

La biblioteca libjsig.so también oculta los manejadores de señales de 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.

# Implementación de la agrupación de manejadores de conexiones para RMI

La agrupación de hebras para manejadores de conexiones para RMI no está habilitada por omisión.

Para habilitar la agrupación de conexiones implementada a nivel TCPTransport de RMI, establezca la opción

    -Dsun.rmi.transport.tcp.connectionPool=true (o cualquier valor no nulo)

Esta versión del Runtime Environment no tiene ningún valor que pueda utilizarse para limitar el número de hebras en la agrupación de conexiones.

Para obtener más información, consulte el sitio de Java de Sun: http://java.sun.com.

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

Para obtener los números de versión y de nivel de compilación de IBM, escriba lo siguiente en el indicador de shell :

`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.

# 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 y Runtime Environment para Linux.

##

- 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 glibc)

  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.
- 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áquinas 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.
- Una llamada a JNI_CreateJavaVM() desde una aplicación JNI podría haber provocado un error de segmentación (señal SIGSEGV); para evitar este error, vuelva a generar el programa de la JNI especificando la opción -lpthread.
- Sólo para 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.
- 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.
- Cuando se ejecuta una aplicación java awt/swing en una máquina Linux y exporta la pantalla a una segunda máquina, puede tener problemas al visualizar algunos diálogos si el conjunto de fonts cargado en la máquina cliente X es diferente del conjunto cargado en la máquina servidor X. Este problema es evidente en especial con SLES8 en entornos locales chinos, en los que la instalación por omisión de la versión del servidor instala fonts arphic, pero no así en la instalación por omisión del cliente. Para evitar este problema, instale los mismos fonts en ambas máquinas.
- Si el entorno local de su sistema utiliza codificación UTF-8, algunas herramientas del SDK pueden generar una sun.io.MalformedInputException. Para determinar si el sistema está utilizando codificación UTF-8, examine las variables de entorno específicas del entorno local como LANG o LC_ALL para ver si terminan con el sufijo ".UTF-8". Si se produce esta sun.io.MalformedInputException, cambie los caracteres que no estén dentro del rango ASCII de 7 bits (0x00 - 0x7f) y que no estén representados como literales de caracteres Unicode de Java por literales de caracteres Unicode de Java (por ejemplo: '\u0080'). También puede solucionar este problema eliminando el sufijo ".UTF-8" de las variables de entorno específicas del entorno local; por ejemplo, si la máquina tiene el entorno local por omisión "en_US.UTF-8", establezca LANG en "en_US".
- Si utiliza AMI y xcin en un entorno de plataforma cruzada (por ejemplo, si intenta exportar la pantalla entre un sistema de 32 bits y uno de 64 bits, o entre un sistema big-endian y un little-endian) pueden producirse algunos problemas. Si tienes este tipo de problema, póngase en contacto con el distribuidor de Linux.
- En Redhat Enterprise Linux 3.0, es posible que los caracteres chinos no se muestren en componentes de texto AWT excepto los caracteres GB2312 en el entorno local GB18030 chino.

# Comentarios sobre esta Guía del usuario

Si tiene algún comentario acerca de la utilidad, o no utilidad, de esta Guía del usuario, estaremos encantados de conocer su opinión a través de uno de estos canales. Tenga en cuenta que estos canales no están destinados a responder consultas técnicas, sólo son para comentarios acerca de documentación. Envíe sus comentarios:

- Por correo electrónico a idrcf@hursley.ibm.com.
- Por fax:
  - Desde el Reino Unido: 01962 842327
  - Desde otro lugar:<código internacional>44 1962 842327
- Por correo a:
  IBM United Kingdom Ltd
  User Technologies,
  Mail Point 095
  Hursley Park
  Winchester
  Hampshire
  SO21 2JN United Kingdom

La letra pequeña. Si elige enviar un mensaje a IBM, acepta que toda la información contenida en su mensaje, incluidos los datos de respuesta, como preguntas, comentarios, sugerencias, etc., se considerarán no confidenciales e IBM no tendrá ningún tipo de obligación sobre dicha información y será libre de reproducir, utilizar, revelar y distribuir la información a otros sin limitaciones. Además, IBM será libre de utilizar cualquier idea, concepto, conocimiento o técnica contenido en dicha información para cualquier tipo de propósito, incluyendo, pero sin limitarse al desarrollo, fabricación y marketing de productos que incluyan dicha información.

# 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 con el representante de IBM de su localidad para obtener información sobre los productos y servicios que están disponibles actualmente 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 patentes o solicitudes pendientes de patente que cubran temas que se tratan en este documento. La posesión de este documento no le otorga ninguna licencia sobre estas patentes. Puede hacer consultas sobre licencias, escribiendo a:

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

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

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

El párrafo siguiente no se aplica en el Reino Unido ni en ningún país en que tales disposiciones entren en contradicción con la legislación local:

INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA ESTA PUBLICACIÓN "TAL CUAL" SIN GARANTÍAS DE NINGÚN TIPO, NI EXPLÍCITAS NI IMPLÍCITAS, INCLUYENDO PERO NO LIMITÁNDOSE A ELLAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIALIZACIÓN O DE ADECUACIÓN A UN PROPÓSITO DETERMINADO. Algunos países no permiten la renuncia a las garantías explícitas o implícitas en determinadas transacciones; por lo que el párrafo anterior puede que no se aplique en su caso.

Esta publicación puede contener incorrecciones 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 en cualquier momento mejoras y/o cambios en los productos y/o programas que se describen en esta publicación sin previo aviso.

Las referencias hechas en esta publicación a sitios Web que no son de IBM se proporcionan únicamente por cortesía y de ningún modo deben interpretarse como un respaldo público 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 se le suministra de la forma en que lo crea conveniente sin que incurra por ello en ninguna obligación con usted.

Los usuarios que dispongan de licencias para este programa y que deseen tener información sobre el mismo con el propósito de poder: (i) intercambiar información entre programas creados de forma independiente y otros programas (incluido éste) y (ii) utilizar mutuamente la información que se ha intercambiado, deben ponerse en contacto con:

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

Dicha información puede estar disponible, sujeta a los términos y condiciones adecuados, incluido en algunos casos, el pago de una tasa.

El programa bajo licencia que se describe en este documento y todo el material bajo licencia disponible para él lo facilita IBM en los términos descritos en IBM Customer Agreement, en IBM International Program License Agreement o en cualquier otro contrato equivalente entre las partes.

Los datos de rendimiento que se hallan en esta publicación se han determinado en un entorno controlado. Por tanto, los resultados que se obtengan en otros sistemas operativos pueden diferir considerablemente. 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. Además, es posible que algunas de las medidas se hayan estimado por medio de extrapolaciones. Es posible que los resultados reales varíen. Los usuarios de este documento deben comprobar los datos que son de aplicación para su entorno en concreto.

La información relativa a productos que no son de IBM se ha obtenido de los proveedores de esos productos, de los anuncios publicados por los mismos o de otras fuentes a disposición del público. 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 es una marca registrada 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.

Linux es una marca registrada de Linus Torvalds 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/.