Problèmes de memory avec Tomcat sur Solaris 10

J'ai un server exécutant Solaris 10. Il rapporte plus de 70 Go de RAM libre. Je tente de démarrer Tomcat 7.0.68 en utilisant Java 1.7.0_80 en mode 64 bits.

Le server prétend qu'il n'est pas capable d'allouer 717 MiB de RAM. Je reçois un file hs_err_pidxxx.log chaque fois que je l'essaye. Cela suggère ceci:

# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 717225984 bytes for committing reserved memory. # Possible reasons: # The system is out of physical RAM or swap space 

Non. Il y a 70 GiB disponibles, il essaie d'allouer 700ish MiB.

 # In 32 bit mode, the process size limit was hit 

Nous sums en mode 64 bits.

 # Possible solutions: # Reduce memory load on the system 

Il n'y a rien d'autre sur cette machine, mais le operating system.

 # Increase physical memory or swap space 

Nous avons déjà deux ordres de grandeur plus que nécessaire.

 # Check if swap backing store is full 

Non.

 # Use 64 bit Java on a 64 bit OS 

Terminé.

 # Decrease Java heap size (-Xmx/-Xms) 

Je le ferais si je le pouvais.

 # Decrease number of Java threads 

Comment cela se fait-il?

 # Decrease Java thread stack sizes (-Xss) 

Des valeurs suggérées? C'est par défaut, mais je ne sais pas ce qu'il faut régler.

 # Set larger code cache with -XX:ReservedCodeCacheSize= 

Encore une fois, nous sums par défaut.


 $ swap -s total: 48607296k bytes allocated + 18201336k reserved = 66808632k used, 311770552k available 

La RAM libre signifie simplement qu'il n'y a rien à y être stocké. Cela ne signifie pas que vous pouvez l'utiliser. Il est parfaitement possible que la RAM soit gratuite pour ne pas être utilisée par votre nouvelle JVM car d'autres applications l'ont réservé. Dans tous les cas, la JVM, tout comme la plupart des applications ne request pas de RAM, mais pour la memory virtuelle. C'est probablement le problème que votre système souffre, un manque de memory virtuelle.

Vous connaîtrez votre utilisation de la memory virtuelle avec cette command:

 swap -s 

La réponse simple à une pénurie de memory virtuelle est simplement d'augmenter (ou de créer) une zone de swap pour les réservations de memory pour avoir une zone de magasin de support.

Modifier: Avec les informations supplémentaires que vous avez postées, la raison pour laquelle votre application ne peut pas allouer plus de memory virtuelle est due au fait que vous exécutez dans une zone non globale où le recouvrement de la memory est en place. Les zones non globales sont des conteneurs, c'est-à-dire qu'ils partagent tous le même kernel. Cependant, leur utilisation des ressources peut être limitée pour empêcher une zone de déranger les autres.

En dehors de l'arrêt d'autres process qui utilisent la memory virtuelle, rien de ce que vous pouvez faire à partir de cette zone, même en tant que root. Vous devez requestr à l'administrateur de la zone globale d' accorder plus de memory virtuelle à votre zone , dans votre cas le zone.max-swap .