2010-09-28 9 views
3

J'ai un programme java qui écoute un socket serveur à l'infini. En cas de sortie anormale de JVM via kill pid, qu'advient-il des ressources système dans ce cas, objet socket? Est-ce que les prises seront libérées ou verrouillées? Quelle est la meilleure façon de gérer le nettoyage des ressources système telles que les descripteurs de fichiers/connexion socket réseau/jdbc, en cas de sortie JVM anormale.Sortie anormale de la JVM - nettoyage des ressources système

Je connais enfin les finaliseurs, mais il y a une certaine quantité d'incertitude et de dégradation des performances en utilisant la finalisation.

Pls fournissent quelques idées

Répondre

4

Dans le cas d'une sortie anormale, évidemment la machine virtuelle Java ne peut rien faire spécifiquement pour nettoyer tout ce qu'il a alloué. Cette responsabilité tomberait à côté du système d'exploitation lui-même.

Pour les sockets, les systèmes d'exploitation modernes libéreront définitivement toutes les sockets qui ont été ouvertes par un processus qui se bloque. La même chose s'applique aux fichiers et à tout autre objet du noyau (les connexions JDBC sont implémentées avec une sorte de socket).

Les finaliseurs ne seront pas exécutés si la JVM se termine anormalement.

+0

Toute possibilité de détecter le crash JVM et de prendre le contrôle du code dans lequel je peux nettoyer les prises ouvertes? Bien sûr, avec l'option finalizer. – user309281

+0

Aussi laissez-moi savoir quel OS vous voulez dire, qui prendra soin de la fermeture automatique des ressources du système lors d'un crash de processus? Je cours mon application sous HP-UX 11.2. – user309281

+1

@ user309281: Non, si la machine virtuelle Java tombe en panne, il est tout simplement impossible d'exécuter du code Java dans le processus de plantage. L'OS nettoiera après vous. Je pense que HP-UX sera robuste à cet égard. –

1

Les ressources système telles que la mémoire, les descripteurs de fichiers et les sockets réseau sont libérées à la fermeture de la machine virtuelle Java. Les connexions aux sockets réseau prendront un certain temps à se fermer en raison des protocoles réseau.

Les connexions JDBC doivent être libérées une fois que la base de données a pris connaissance que l'autre extrémité de la connexion s'est fermée. Les minuteurs Keep-alive peuvent aider à nettoyer la connexion plus rapidement. La base de données nettoie les transactions ouvertes et libère les verrous lorsqu'elle nettoie les connexions.