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?
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
** 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