2012-06-04 15 views
8

Esto es 64 bits Windows 7 Enterprise y 64 bits Java 7:no puede ejecutar una JVM de 64 bits en Windows de 64 bits 7 con un gran tamaño de la pila

java version "1.7.0_04" 
Java(TM) SE Runtime Environment (build 1.7.0_04-b20) 
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) 

Esto ocurre usando una cáscara de ambos C:\Windows\SystemWOW64\cmd.exe (que pensé incorrectamente que era la versión de 64 bits) y con C:\Windows\System32\cmd.exe (que acabo de descubrir, cortesía de Pulsar, es una aplicación de 64 bits a pesar del nombre de ruta).

El programa en sí es trivial:

public class Trivial 
{ 
    public static void main(String[] args) { 
     System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory())); 
     System.out.println("max = " + toMB(Runtime.getRuntime().maxMemory())); 
    } 

    private static long toMB(long bytes) { 
     return bytes/(1024L * 1024L); 
    } 
} 

sólo estaba jugando con diferentes -Xmx y -Xms argumentos para ver lo que sucedería. Sin embargo, hubiera pensado que con Java de 64 bits en Windows de 64 bits podría usar casi cualquier tamaño máximo y montón inicial que quisiera, pero eso no es lo que está sucediendo.

java -Xmx16G -Xms2G Trivial (por ejemplo) funciona bien.

Error occurred during initialization of VM 
Could not reserve enough space for object heap 

Más extraño (para mí), java -Xmx16G -Xms3G Trivial da un error diferente::

Error occurred during initialization of VM 
Unable to allocate tables for parallel garbage collection for the requested heap size. 
Error: Could not create the Java Virtual Machine. 
Error: A fatal exception has occurred. Program will exit. 

ha intentado dividir la diferencia entre 2G y 3G para ver si había un tamaño específico, donde sin embargo, java -Xmx16G -Xms4G Trivial me da esto sucedió, lo intenté java -Xmx16G -Xms2900M Trivial y funcionó. Luego probé -Xms2960M y funcionó. Con -Xms2970m la JVM se estrelló:

# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp 
# An error report file with more information is saved as: 
# C:\Users\QuantumMechanic\Temp\hs_err_pid10780.log 

que se mantuvo hasta -Xms2995M cuando cambió de nuevo a la "no puede asignar mesas para la recolección de basura en paralelo" mensaje y pegado con eso como -Xms se aumentó aún más.

¿Qué podría estar pasando? ¿Lanzar algo desde cmd.exe (incluso uno de 64 bits) impone algunos límites de tamaño de proceso? ¿Necesita Windows (o JVM) un único bloque de memoria enorme? (Pero entonces ¿por qué los diferentes mensajes)? ¿Algo más?

Respuesta

3

En un sistema de 64 bits, que tiene 2^63Bytes de direcciones de usuario espacio, pero aún así sólo se puede asignar la cantidad de memoria real que tiene (física + archivo de página + archivos mapeados).

Cuando la JVM crea el montón, es el uso de C malloc() para solicitar una porción inicial de la memoria y luego se va a administrar el trozo por sí mismo. Incluso si no tiene ningún objeto en el montón, para el SO se está utilizando el fragmento.

Como ha especificado -Xms, que es el valor mínimo del grupo de memoria, la JVM simplemente intentará requerir esa cantidad de memoria del sistema operativo o fallará ya que no puede satisfacer su comando.

Supongo que si quiere ver la ventaja de Java de 64 bits. Tal vez puedas intentar abrir un archivo de más de 4 GB para el acceso aleatorio y asignarlo a un MappedByteBuffer.

+0

Un posible límite de espacio de intercambio. No había pensado en eso. Cuando regrese al trabajo mañana revisaré la configuración del tamaño del archivo de paginación en esa computadora y veré en qué está configurado. – QuantumMechanic

+3

** Tamaño ** de intercambio. En lugar de ser administrado automáticamente, por alguna razón el archivo de paginación en la computadora que estaba usando se configuró a un tamaño constante de 4GB. La RAM de la computadora era de 8GB, así que en el mejor de los casos había 12GB de memoria virtual y, por supuesto, había muchos otros programas en ejecución. Cuando aumenté el tamaño del archivo de paginación, pude tener un valor '-Xms' mucho más alto. – QuantumMechanic

5

SysWoW64 se refiere a 32bit Windows on Windows 64. Simplificado: ventanas de 32 bits que se ejecutan en Windows 64 bits).

Por lo tanto, solicita explícitamente que se ejecute en un shell cmd de 32 bits.

Por favor, vea:

http://en.wikipedia.org/wiki/WoW64

+0

Gracias por la información. Nunca supe que '\ Windows \ System32' contiene aplicaciones de 64 bits. Sin embargo, ese no es el problema, lo mismo sucede cuando uso 'C: \ Windows \ System32 \ cmd.exe'. – QuantumMechanic

Cuestiones relacionadas